2016-01-18 133 views
1

我編寫了一個應用程序,它檢測所有活動的Windows並將它們放入列表中。模擬鼠標點擊而不移動光標

有沒有一種方法可以在屏幕上相對於Windows位置模擬鼠標點而不實際移動光標?

我沒有訪問按鈕處理是應該被點擊,只能到窗口

+1

錯誤的問題。下面是你應該問的問題的答案:[UI自動化](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)。現場演示請查看SDK附帶的[Inspect](https://msdn.microsoft.com/en-us/library/windows/desktop/dd318521.aspx)工具。 – IInspectable

+0

你想在一些隨機的窗口列表中按下按鈕似乎很奇怪。也許你正在尋找'SetForegroundWindow' –

+0

@Barmak Shemirani,我有多個窗口的客戶端,需要在屏幕上同時進行監控,程序應該把每個窗口中的某個標題放在一個列表中並鋪設其中12個以每種屏幕上的特定模式出現。目前爲止,我只需要一個額外的功能,每隔n分鐘在第三方應用程序中點擊一個按鈕即可打開這些窗口。 – ColdZer0

回答

3

的手柄有沒有一種方法來模擬相對於屏幕上的一個點鼠標點擊沒有實際移動光標的Windows位置?

要回答您的具體問題 - 沒有。鼠標點擊只能指向鼠標光標實際位於點擊時的位置。 正確的模擬鼠標輸入的方法是使用SendInput()(或舊版系統中的mouse_event())。但是,這些功能注入模擬事件到同一輸入隊列,實際的鼠標驅動程序員額,所以他們會對鼠標的物理效應 - 即移動它在屏幕上,等

How do I simulate input without SendInput?

SendInput運行在輸入堆棧的底層。 這只是進入相同輸入機制的後門,鍵盤和鼠標驅動程序使用來告訴窗口管理器用戶已生成輸入。 SendInput函數不知道輸入會發生什麼。這是由窗口管理器的更高層來處理的,就像敲擊測試鼠標輸入以查看消息最初應該傳送到哪個窗口的組件。

When something gets added to a queue, it takes time for it to come out the front of the queue

當你調用SendInput,你把輸入數據包到系統硬件輸入隊列。 (注意:不是官方的術語,這正是我今天所說的)。這是硬件設備驅動程序堆棧在物理設備報告事件時使用的輸入隊列。

消息進入硬件輸入隊列,原始輸入線程將其拾取。原始輸入線程以高優先級運行,所以它可能會很快得到它,但在多核機器上,您的代碼可以繼續運行,而第二個核心運行原始輸入線程。原始輸入線程有一些它需要做的事情,一旦它離開事件。如果有低級別的輸入鉤子,它必須調用每個鉤子來查看是否有任何鉤子要拒絕輸入。 (並且這些鉤子可能需要知道多長時間來決定)。只有在輸入的所有低級掛鉤簽名後,原始輸入線程才允許修改輸入狀態並使GetAsyncKeyState報告該鍵是下。

要做的事情唯一真正的方法是找到位於所需屏幕座標的UI控件的HWND。此後,您可以:

  1. 發送WM_LBUTTONDOWNWM_LBUTTONUP消息直接給它。或者,在標準的Win32按鈕控件的情況下,請發送一個BM_CLICK消息。

  2. 使用UI Automation API的AccessibleObjectFromWindow()功能訪問控制的IAccessible接口,然後調用其accDoDefaultAction()方法,這對於一個按鈕單擊它。

話雖這麼說,...

我沒有訪問按鈕處理是應該被點擊。

您可以訪問任何有HWND的東西。例如,看看WindowFromPoint()。您可以使用它來查找佔用所需屏幕座標的按鈕的HWND(當然有注意事項:WindowFromPoint, ChildWindowFromPoint, RealChildWindowFromPoint, when will it all end?)。

+0

謝謝,不知道得到按鈕手柄是這麼簡單,我會試試看! – ColdZer0

+1

@ ColdZer0:如果有一個本地窗口支持按鈕控件,那很容易。這通常不是這種情況。 Web瀏覽器通常不使用本機控件。 Qt應用程序也沒有。儘管這兩種都支持UI自動化。 – IInspectable

+0

@IInspectable:是的。如果座標處的實際'HWND'不是Win32按鈕,則不能使用'BM_CLICK'。然而,你仍然會有一個真正的'HWND',並且在這些座標處發送'WM_LBUTTON ...'到它所需的任何非窗口控件將會根據需要逐漸下降。但是,如果它支持UI自動化,那也有幫助,因爲您可以枚舉其他不可訪問的子控件。 –