2012-05-12 94 views
3

我嘗試將WM_LBUTTONDOWN和WM_LBUTTONUP消息發送到窗口(模擬鼠標點擊而不移動光標)。爲什麼SendMessage()函數不起作用?

我的計劃正在許多窗戶非常好,但也有少數不工作 :( 像註冊表編輯器,雅虎通,一些Firefox的網站,等等......

如何我可以與來自上述工作??

注1:我用的Win7

注2:我的代碼只是調用API和功能APLY他們在特定的窗口句柄它工作正常,但不是在所有窗口:(

+0

註冊表編輯器將以管理員身份運行,因此您的程序將無權向其發送Windows消息,除非它也以管理員身份運行。 – Ben

回答

4

這是UAC的另一個方面,稱爲UIPI或用戶界面隱私隔離,可能會導致此問題。旨在防止劫持高級程序的性能不升級的程序。這當然可以解釋Regedit.exe的問題,如果一個程序可以指示它將東西戳到註冊表中,那麼UAC顯然是無效的。你必須運行你的程序來繞過這個限制。

另一個是SendMessage()不能正確模擬鼠標輸入。您發送的消息通常是發送到消息隊列。您需要使用PostMessage()。你也應該模擬WM_MOUSEMOVE。

模擬鼠標輸入的正確方法是通過SendInput()。那一個正好模擬鼠標驅動程序的行爲,程序沒有辦法區分。但有了額外的要求,您必須確保您嘗試自動化的任何程序在前臺運行。這非常困難,SetForegroundWindow()不夠可靠。所以只要考慮SendInput(),如果你實際上只想發送鼠標消息到前臺窗口,不管它是什麼。

+0

感謝您通知我Hans, 如果它是前景窗口,它非常簡單:)但是,我想模擬點擊而不移動光標導致窗口被最小化。所以如果我使用POSTMESSAGE INSTEAD,它會更好? –

+0

點擊最小化窗口?這是一件很奇怪的事情。本身就有很多失敗的原因。 –

+0

對我來說是UIPI,我花了好幾天時間仔細閱讀Spy ++並嘗試各種Post和Send消息變體以使其發揮作用。感謝張貼,感謝你我終於完成了。 – Fehr

0

您可以撥打SwitchToThisWindow代替SetForegroundWindow,這是好多了,它的作品大部分時間,然後要麼調用SendInputmouse_event,這是更舒適,因爲你不處理結構在所有。