2011-08-28 134 views
3

我正在尋找一種方法來將鼠標點擊發送到Windows上的後臺應用程序(即通過句柄),我用來確認我的代碼的測試窗口正在接受並處理點擊,但我的目標應用程序不雖然Spy ++顯示消息)。什麼會導致PostMessage發送的鼠標點擊被忽略?

這可能是什麼原因造成的?有沒有解決辦法?

這裏是我使用的C#代碼。

public enum WMessages : int 
{ 
    WM_LBUTTONDOWN = 0x201, 
    WM_LBUTTONUP = 0x202, 

    WM_KEYDOWN = 0x100, 
    WM_KEYUP = 0x101, 

    WH_KEYBOARD_LL = 13, 
    WH_MOUSE_LL = 14, 
} 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
private static extern int PostMessage(HandleRef hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

public void SendClick(WMessages type, Point pos) 
{ 
    switch(type) 
    { 
     case WMessages.WM_LBUTTONDOWN: 
      PostMessage(new HandleRef(null, this.process.MainWindowHandle), 
       (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1, 
       (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF))); 
      return; 
     case WMessages.WM_LBUTTONUP: 
      PostMessage(new HandleRef(null, this.process.MainWindowHandle), 
       (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1, 
       (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF))); 
      return; 
     default: 
      return; 
    } 
} 

SendClick(WMessages.WM_LBUTTONDOWN, Cursor.Position); 
SendClick(WMessages,WM_LBUTTONUP, Cursor.Position); 

這是可能實現?有沒有更好的方法來實現這個目標?

注意:上述代碼在應用程序處於活動狀態並且鼠標懸停在正確位置時不起作用。我也在專門將輸入發送到後臺應用程序,所以SendInput和其他人無法解決問題。

謝謝

+0

你怎麼知道,如果你看到經歷的信息它不工作?可能是因爲你的位置是錯誤的,它得到它但沒有做任何事情,因爲它是它的區域外的點擊 –

+0

要使用HWND將屏幕座標(即'Cursor.Position')轉換爲客戶端座標,請使用http://msdn.microsoft .com/en-us/library/dd162952(v = vs.85).aspx –

+0

您的pinvoke聲明是錯誤的。使用pinvoke.net找到正確的。 –

回答

2

您是否試過SendMessage調用而不是PostMessage? SendMessage立即調用窗口的處理程序。 PostMessage將消息放在列表中供以後處理。

+1

SendMessage只是在調用類PostMessage機制來將消息發送到目標進程時凍結調用進程。只有在窗口處於同一進程中時,該調用才立即進行。此外,SendMessage在來自不同進程的SendMessage調用中調用的消息處理程序中失敗 - 以防當進程彼此等待時發生死鎖。請記住,COM調用另一個pocesses中的COM對象在內部使用SendMessage - 所以不要直接在COM對象方法中調用SendMessage ....天哪,Win32是一團糟...... –

3
 public void SendClick(WMessages type, Point pos) 
{ 
    switch(type) 
    { 
     case WMessages.WM_LBUTTONDOWN: 
      PostMessage(new HandleRef(null, this.process.MainWindowHandle), 
       (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1, 
       (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF))); 
      return; 
     case WMessages.WM_LBUTTONUP: 
      PostMessage(new HandleRef(null, this.process.MainWindowHandle), 
       (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0x1, // <--(2) but you are telling to do WM_LBUTTONDOWN 
       (IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF))); 
      return; 
     default: 
      return; 
    } 
} 

SendClick(WMessages.WM_LBUTTONDOWN, Cursor.Position); 
SendClick(WMessages.WM_LBUTTONUP, Cursor.Position); // <--(1) you are sending WM_LBUTTONUP 

所以剛纔讀(1)第(2)然後,你的問題就解決了

相關問題