P / Invoked ShowCursor返回0

时间:2012-10-05 20:06:37

标签: winforms pinvoke dll-injection

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

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

1 个答案:

答案 0 :(得分: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()来触发它。我想。