2012-10-05 39 views
0

我正在寫一個應用程序需要發送消息到另一個應用程序,使光標可見。我在編程方面的絕大多數經驗都在C#中,並且我設法編寫了一個DLL Injector,它允許我使用CreateRemoteThread注入託管代碼。在我注入的DLL內部是對ShowCursor的P/Invoked調用。然而,這似乎沒有效果,並且使用StreamWriter檢查ShowCursor返回值的值顯示,當函數成功並且顯示計數器遞增時,在其他點處計數器返回到0.(應該顯示光標無論如何,現在我想到了。)P /調用ShowCursor返回到0

我錯過了哪些重要的信息? Windows窗體是否有一些功能可以阻止我像這樣更改光標? ShowCursor綁定到正在運行的線程,所以它在完成時恢復?或者是完全不同的東西?

回答

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()來觸發它。我認爲。

+0

許多年以後,我想起了這多少節省了我的一天,以及我完全忘了標記它是正確的。再次感謝你! –