2013-08-04 91 views
2

我有我的功能在這裏工作,但我肯定會錯誤的方式。C++鼠標點擊窗口中的某個點

我的程序使用FindWindow來找到正確的窗口。我需要雙擊此窗口上的特定位置。

我通過將窗口始終放在屏幕上的相同位置來實現它,但如果我移動窗口,程序將嘗試單擊我提供的硬編碼位置,它將無法工作。

下面是函數:

void lobbyWindow(HWND main_client) 
{ 
    //RECT arect; 

    // GetWindowRect(main_client, &arect); 

    SetCursorPos(748,294); 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); 
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); 
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 

} 

正如你可以看到我剛剛把鼠標移動到748294和雙擊。我想要做的就是在main_client窗口中將鼠標設置爲100,100,所以如果我移動main_client窗口,鼠標仍然點擊正確的位置。

+0

您可能正在尋找[Microsoft Active Accessibility](http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd373592.aspx)。 – IInspectable

回答

3

如果你的窗口點擊是在另一個線程/過程中,這種方法從根本上是有缺陷的,因爲當您發送點擊時,窗口可以移動 - 即使您有正確的位置開始,也不能保證所有點擊都會在同一個地方結束。

說了這麼多,你可以轉換相對客戶端座標使用ClientToScreen API函數屏幕座標:

POINT pt = { 100, 100 }; 
ClientToScreen(main_client, &pt); 

根據目標窗口中,你可能會發現你可以簡單地將它張貼一個WM_LBUTTONDBLCLK消息在適當的位置模擬輸入:

PostMessage(main_client, WM_LBUTTONDBLCLK, MK_LBUTTON, MAKELPARAM(100, 100)); 
2

SetCursor()需要屏幕座標,所以你需要計算在您雙擊會在屏幕座標相對於風ow當前的屏幕位置。你可以做到這一點有兩種方法:

  1. 使用GetWindowRect()檢索窗口的當前屏幕座標

    ,然後抵消由預期的相對座標。

  2. 使用ClientToScreen()MapWindowPoints()將相對座標轉換爲屏幕座標。

一旦你預期的屏幕座標,你可以將它們傳遞給SetCursor()

相關問題