0

我正在编写的应用程序需要向另一个应用程序发送消息以使光标可见。我的绝大多数编程经验都是用 C# 编写的,并且我设法编写了一个 DLL Injector,它允许我使用 CreateRemoteThread 注入托管代码。我正在注入的 DLL 内部是对 ShowCursor 的 P/Invoked 调用。然而,这似乎没有任何效果,并且使用 StreamWriter 检查 ShowCursor 返回的值表明,虽然函数成功并且显示计数器增加,但在其他某个点计数器返回到 0。(应该显示光标无论如何,现在我想起来了。)

我错过了什么重要的信息?Windows 窗体是否有一些功能阻止我像这样更改光标?ShowCursor 是否绑定到它正在运行的线程,所以它在完成后恢复?还是完全不同的东西?

4

1 回答 1

2

当然。即使在自己的线程上运行它,您也可以很容易地看到它不起作用:

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() 来触发它。我认为。

于 2012-10-06T00:30:06.267 回答