2010-05-12 6 views
6

프로그램에 마우스 클릭을 보내려고합니다. 마우스를 움직이기를 원하지 않기 때문에 SendInput이나 mouse_event를 사용하고 싶지는 않습니다. 그리고 클릭을 받아야하는 윈도우가 실제로 Button이나 다른 GUI 이벤트를 사용하지 않기 때문에, 이것들에 메시지를 보낼 수 없습니다 버튼.메시지를 보내 마우스를 클릭하십시오.

SendMessage를 사용하여이 기능을 작동 시키려고하는데, 어떤 이유로 작동하지 않습니다. 관련 코드 (C#으로하지만,뿐만 아니라 jnative 자바 시도)입니다

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
    public static extern int SendMessage(IntPtr A_0, int A_1, int A_2, int A_3); 

    static int WM_CLOSE = 0x10; 
    static int WM_LBUTTONDOWN = 0x201; 
    static int WM_LBUTTONUP = 0x202; 

    public static void click(IntPtr hWnd, int x, int y) 
    { 
     SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((x << 0x10)^y)); 
     SendMessage(hWnd, WM_LBUTTONUP, 0, ((x << 0x10)^y)); 
    } 

    public static void close(IntPtr hWnd) 
    { 
     SendMessage(hWnd, WM_CLOSE, 0, 0); 
    } 

close 잘 작동 비스타

에서이 작업을 시도하지만, click 아무것도하지 않습니다.

편집 : 문제가 발견되었습니다. x와 y 좌표를 대체하는 바보 같은 버그 외에도 아래에 제안 된 것처럼 클릭을받는 창 핸들도 올바른 클라이언트 창인지 확인하지 않았습니다. 나는 지금있다

 POINT p = new POINT(x, y); 
     IntPtr hWnd = WindowFromPoint(p); 

     RECT rct = new RECT(); 

     if (!GetWindowRect(hWnd, ref rct)) 
     { 
      return; 
     } 

     int newx = x - rct.Left; 
     int newy = y - rct.Top; 
     SendMessage(hWnd, WM_LBUTTONDOWN, 1, newy * 65536 + newx); 
     SendMessage(hWnd, WM_LBUTTONUP, 0, newy * 65536 + newx); 

완벽하게 작동합니다.

답변

4

문제는 x, y 좌표의 포장에 있습니다.

  1. y가 높은 순서 단어에 있어야
  2. 당신은 사용해야 | (비트 OR)

당신은해야 좌표 쌍 구성 요소를 결합하려면 다음

당신은 크리스는 말한다처럼도 제대로 좌표를 팩 클라이언트 좌표는 그 x와 y를 기억할 필요가
((y << 0x10) | x) 
+0

@tobbez, MAKELPARAM은 C 매크로이고, OP 코드는 실제로 C#이며 Interop을 사용하여 Win32 API를 호출합니다. –

+1

더 나은'(y << 16) | (x & 0xffff)' – BlackBear

관련 문제