我正在编写的应用程序需要向另一个应用程序发送消息以使光标可见。 我在编程方面的绝大多数经验都是用 C# 编写的,我已经设法编写了一个 DLL 注入器,它允许我使用 CreateRemoteThread 注入托管代码。 在我注入的DLL中是对ShowCursor的P/Invoked调用。 然而,这似乎没有效果,并且使用 StreamWriter 检查 ShowCursor 返回的值显示,虽然函数成功并且显示计数器递增,但在其他某个点,计数器返回到 0。(无论如何,现在我想到了,它应该显示光标。
我错过了哪些重要信息? Windows 窗体是否具有阻止我像这样更改光标的某些功能? ShowCursor是否绑定到它正在运行的线程,因此它在完成后恢复? 还是完全不同的东西?
当然。 您可以轻松看到,即使您在自己的线程上运行它,它也不起作用:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
System.Threading.ThreadPool.QueueUserWorkItem((o) => {
int cnt = ShowCursor(false);
System.Diagnostics.Debug.Print("Count = {0}", cnt);
});
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int ShowCursor(bool show);
}
光标不会移动。 您必须在该进程的 UI 线程上注入代码。 很难做到,SetWindowsHookEx()设置,比如说,一个WH_CALLWNDPROC钩子和SendMessage()来触发它。 我认为。