2012-10-05 2 views
0

필자가 작성한 응용 프로그램은 다른 응용 프로그램에 메시지를 보내 커서가 보이도록해야합니다. 프로그래밍에 대한 내 경험의 대부분은 C#에 있으며 CreateRemoteThread를 사용하여 관리되는 코드를 주입 ​​할 수있는 DLL Injector를 작성했습니다. DLL을 주입하는 중에는 ShowCursor에 대한 P/Invoked 호출이 있습니다. 그러나 이것은 효과가없는 것처럼 보입니다. 그리고 StreamWriter를 사용하여 ShowCursor가 반환하는 값을 확인하면 함수가 성공하고 표시 카운터가 증가하는 동안 카운터가 0으로 되돌아갑니다. (커서를 표시해야합니다. 어쨌든, 이제 생각해 보겠습니다.)P/Invoked ShowCursor가 0으로 돌아옴

중요한 정보는 무엇입니까? Windows Forms에는 커서를 이와 같이 변경하지 못하게하는 몇 가지 기능이 있습니까? 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

몇 년 후 나는 이것이 내 하루를 얼마나 많이 절약했는지 그리고 나는 그것을 옳은 것으로 표시하는 것을 완전히 잊어 버린 것을 기억했다. 다시 감사합니다! –