2010-05-12 159 views
6

我試圖將鼠標點擊發送到程序。因爲我不希望鼠標移動,所以我不想使用SendInput或mouse_event,並且因爲應該接收點擊的窗口並不真正使用按鈕或其他GUI事件,所以我無法向這些消息發送消息鈕釦。通過發送消息單擊鼠標

我想讓這個工作使用SendMessage,但由於某種原因它不起作用。相關代碼(在C#中,但試圖與Java jnative爲好),在Vista上

[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. 你應該使用| (按位或)座標對的組件組合

您應該具有以下

((y << 0x10) | x) 
+0

@tobbez,問題是MAKELPARAM是一個C宏,OP代碼實際上是C#,他使用Interop調用Win32 API。 – 2012-08-04 18:55:24

+1

甚至更​​好'(y << 16)| (x&0xffff)' – BlackBear 2017-04-27 14:02:44

0

您需要正確地收拾座標像克里斯說,還記得x和y是客戶座標,請致電ScreenToClient()轉換屏幕座標。