簡體   English   中英

如何在后台窗口中移動鼠標?

[英]How to move mouse in background window?

我想在后台窗口中使用鍵盤和鼠標(窗口是一個dx窗口)。

HWND myhwnd = GetForegroundWindow();
PostMessage(myhwnd, WM_KEYDOWN, 0x33, 0); //press "3"
PostMessage(myhwnd, WM_KEYUP, 0x33, 0);
LPARAM lParam = MAKELPARAM(300,100);
PostMessage(myhwnd, WM_MOUSEMOVE, 0,lParam); // mouse move
PostMessage(myhwnd, WM_RBUTTONDOWN, 0,lParam); // mouse click
PostMessage(myhwnd, WM_RBUTTONUP, 0, lParam);

按“3”,鼠標點擊成功。但我移動鼠標失敗了。

移動鼠標會導致窗口將消息發布到擁有直接位於鼠標光標下方的窗口的線程的輸入隊列中(除非使用SetCapture捕獲鼠標)。 但發布消息不會導致鼠標移動。 您可能必須使用SendInput Windows API來實現硬件輸入的模擬。 由於鼠標輸入與鼠標光標正下方的窗口相關聯,您可能必須將窗口置於前面,然后調用SendInput。 鍵盤輸入模擬只會進入前景窗口。 鍵盤輸入也可以使用SendInput進行模擬。

但通常由於像EDIT和其他人一樣處理鍵盤消息的窗口控制方式 - 通過將閃爍的光標移動到一個字符串,當它們獲得WM_KEYDOWN時 - 你可以經常通過手動發布消息來短路它們。 這種短路通常不適用於鼠標消息,因為當窗口接收到10,20的WM_MOUSEMOVE時,窗口不會將鼠標移動到位置10,20,而是他們希望鼠標位於該位置。 還有許多其他原因使得帖子消息方法不適用於鼠標輸入。

無論是否為前景窗口,都會為鼠標光標下方的窗口生成WM_MOUSEMOVE消息。 WM_MOUSEMOVE (如WM_TIMERWM_PAINT )消息不會發布到線程的消息隊列中。 當線程的消息隊列為空並且線程調用GetMessage時,它們是動態生成的。 如果窗口似乎沒有收到WM_MOUSEMOVE消息,那可能是因為消息隊列永遠不會完全耗盡。

重定向鍵盤輸入是一個非常奇怪的概念。 用戶希望鍵盤輸入轉到前台窗口。 實際上,前景窗口定義為:

用戶當前正在使用的窗口。

重定向鍵盤輸入涉及使用SetWindowsHookEx攔截輸入以安裝鍵盤掛鈎低級鍵盤掛鈎 必須記錄輸入並隨后將其發送到所需目標。 操作系統不支持此操作,並且會以或多或少的方式失敗(例如,請參閱重播輸入與重新處理輸入不同 )。 系統控制的內部狀態也將不同步,像GetAsyncKeyState這樣的GetAsyncKeyState將返回不匹配的結果。

暫無
暫無

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

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