2010-11-14 83 views
1

我想模擬「硬件」鼠標點擊,因爲它看起來像是一些軟件從PostMessage輸入例如。我知道有SendInput,但這不是一個選項,因爲我需要它在後臺窗口中兼容。該解決方案似乎是一個低級別的鼠標掛鉤,但我搜索周圍,找不到任何東西,只是記錄器,沒有移動鼠標,點擊等操作。我希望這發生,而不必寫一些某種C++/C包裝用作假鼠標驅動程序。用C鼠標鉤#

http://support.microsoft.com/kb/318804,我發現這個,但它似乎沒有任何進一步的幫助。

任何幫助理解:)

+0

低級別的鼠標鉤子不模擬新的鼠標事件,它只是允許處理現有的事件。 – 2010-11-14 13:47:57

+1

對不起,我不知道有什麼方法讓鼠標驅動程序發送一個真正的點擊給系統,而用戶沒有真正按下按鈕,從安全的角度來看,我想這是有道理的。你可能想,我不知道,訓練一隻貓去點擊那個按鈕...... – 2010-11-14 13:48:48

回答

1

mouse_event或用於注入鼠標輸入SendInput。但就像一個真正的鼠標,它是全局輸入,不能在隱藏的窗口上工作。

低級別鼠標鉤子也是全局的,但它用於截取和操縱鼠標輸入,而不是注入輸入。

針對特定窗口時,您需要使用SendMessage,但正如您所指出的,它並不適用於所有應用。

您還可以使用dll掛鉤(例如IAT掛鉤)來攔截對返回gobal光標位置或鼠標按鈕狀態的API的調用。但爲此,您需要將dll注入到目標應用程序中,並且該dll不應使用.net。

+0

我該如何去做一個IAT鉤子?我已經做了一個引導程序,並注入了一個託管程序集,所以我想我可以實現它。 – miceiken 2010-11-14 18:29:56

+0

使用IAT掛鉤是最後的手段。檢查你是否真的無法使它發送消息。信息應該在大多數程序中工作(通常只有遊戲不能工作)。並且不要使用託管代碼。對於其中的一個,你會在整個.net運行時帶入開銷。由於無法並行加載多個.net版本(至少對.net 1到3是真的,可能與4一起使用),它也可能導致問題。 http://blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx – CodesInChaos 2010-11-14 18:35:38

+0

要編寫一個IAT鉤子,你需要注入一個DLL,然後檢查目標模塊的導入地址表,並替換指向你想用你的替換函數指針鉤住的函數的指針。如果你真的想這樣,我可以提供Delphi代碼。 – CodesInChaos 2010-11-14 18:37:20

2

不知道'某些軟件'可能是什麼,但是可以肯定的是,UAC阻止你將消息戳到高級程序的窗口中。它被稱爲UIPI,用戶界面特權隔離。

一般來說,使用PostMessage僞造輸入根本不起作用。鍵盤輸入尤其是一個問題,但鼠標輸入也有問題。沒有好辦法改變另一個進程的鍵盤狀態。當程序在處理輸入消息時檢查Shift,Ctrl和Alt鍵的狀態時,這很重要。很多人都這樣

唯一真正的解決方案是使用SendInput()模擬輸入。現在你有一個焦點問題需要解決。

+0

一些軟件,例如遊戲.. – miceiken 2010-11-14 18:29:11

+0

遊戲通常不使用消息循環來獲取鼠標和鍵盤信息。 PostMessage()確實不適合他們,SendInput應該。 – 2010-11-14 19:23:10

0

當我必須模擬鼠標輸入時,我首先嚐試使用SendMessage,但有時一些控件或應用程序可能會吃掉該消息。在這種情況下,我使用spy ++攔截持有該控件的窗口的消息,我完全按照我想要模擬的內容,然後,我只使用:

GetWindowLong(hwnd,GWL_WNDPROC);

得到窗口過程,然後直接調用WND PROC:

CallWindowProc的(WNDPROC lpPrevWndFunc,HWND的HWND,UINT消息,WPARAM wParam參數,LPARAM lParam的)

發送正是我看到使用這些消息間諜++。這總是有效,因爲窗口過程立即被調用,而不是在消息循環中排隊。

1

看看這個庫http://globalmousekeyhook.codeplex.com/。 它是100%託管的c#代碼來安裝全局鼠標和鍵盤鉤子。

+0

謝謝,但我實際上是在尋找相反的東西。一種「發送」鍵和鼠標點擊的方式,就好像它是硬件一樣。 – miceiken 2011-10-21 16:12:38