簡體   English   中英

模擬鼠標點擊而不移動光標

[英]Simulate mouse click without moving the cursor

我編寫了一個應用程序來檢測所有活動的 Windows 並將它們放入一個列表中。

有沒有辦法在不實際移動光標的情況下模擬屏幕上相對於 Windows 位置的某個點的鼠標點擊?

我無權訪問應該單擊的按鈕句柄,只能訪問窗口的句柄

有沒有辦法在不實際移動光標的情況下模擬屏幕上相對於 Windows 位置的某個點的鼠標點擊?

回答您的具體問題 - 否。 鼠標單擊只能指向單擊時鼠標光標實際所在的位置。 模擬鼠標輸入的正確方法是使用SendInput() (或舊系統上的mouse_event() )。 但是這些函數將模擬事件注入到實際鼠標驅動程序發送到的相同輸入隊列中,因此它們將對鼠標光標產生物理影響 - 即在屏幕上移動它等。

如何在沒有 SendInput 的情況下模擬輸入?

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

當某些東西被添加到隊列中時,它需要時間才能從隊列的前面出來

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

消息進入硬件輸入隊列,原始輸入線程在那里接收它們。 原始輸入線程以高優先級運行,因此它可能會非常快地接收它,但是在多核機器上,您的代碼可以在第二個核心運行原始輸入線程時繼續運行。 並且原始輸入線程在事件出列后需要做一些事情。 如果有低級輸入鈎子,它必須調用這些鈎子中的每一個來查看是否有任何一個想要拒絕輸入。 (而那些鈎子可能需要不知道多長時間才能決定。)只有在所有低級鈎子在輸入上簽字后,原始輸入線程才允許修改輸入狀態並導致 GetAsyncKeyState 報告密鑰為下。

做你所要求的唯一真正的方法是找到位於所需屏幕坐標的 UI 控件的HWND 然后你可以:

  1. 直接向它發送WM_LBUTTONDOWNWM_LBUTTONUP消息。 或者,在標准 Win32 按鈕控件的情況下,改為發送單個BM_CLICK消息。

  2. 使用UI 自動化API 的AccessibleObjectFromWindow()函數訪問控件的IAccessible接口,然后調用其accDoDefaultAction()方法,對於按鈕將單擊它。

話雖如此, ...

我無權訪問應該單擊的按鈕句柄。

您可以訪問任何具有HWND 例如,看看WindowFromPoint() 您可以使用它來查找占據所需屏幕坐標的按鈕的HWND (當然有警告: WindowFromPoint、ChildWindowFromPoint、RealChildWindowFromPoint,什么時候會全部結束? )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM