2012-05-17 73 views
3

如何在傳統程序中單擊鼠標時模擬擊鍵。注意!該程序可能不知道的是,鼠標點擊忽略鼠標單擊併發送鍵盤輸入到外部應用程序

我與

IntPtr module = LoadLibrary("user32.dll"); 
_mouseHookHandle = (HookType.MouseLowLevel, _mouseDelegate, module, 0); 

和測試試驗返回-1從HookProc。但是當我這樣做時,SendInput不會將我的輸入發送到應用程序。 如果我返回CallNextHookExSendInput的結果,但是然後鼠標單擊被髮送到傳統應用程序。

背景

我們有一個有特殊鍵盤控制的程序。按下鍵盤上的按鍵時,會發送一系列ESC和字母。程序然後根據鼠標放置在屏幕上執行操作。

我正在開發一個屏幕鍵盤,以便您可以在沒有此特殊鍵盤的情況下控制應用程序。用戶用鼠標選擇按鈕屏幕上的鍵盤。然後用戶將鼠標指針移動到他想要發送突擊隊的對象,然後再次單擊。但是,也就是說,鼠標點擊可能不會傳遞給程序,程序會在點擊鼠標時執行另一個操作。

+0

你需要的PInvoke GetForegroundWindow + GetWindowThreadProcessId找出進程具有焦點。 –

回答

2

作爲一種可能的方法,您可以使用簡單的SendMessage將任何窗口消息直接發送到目標窗口。它可以用於外部應用程序的窗口。 (但是你需要找到目標窗口的句柄來使用這個函數)。通過這種方式,您也可以發送任何鍵盤和鼠標事件。

忽略鼠標事件更困難。您需要對該窗口進行子類化,即將您自己的自定義窗口過程附加到篩選窗口消息。爲了實現這一點,您需要將DLL注入受控進程。
整體任務非常複雜,它不是一個簡單的代碼片段,您可以複製粘貼。

+0

我通過創建一個放在屏幕上的透明窗口來解決它。它需要照顧鼠標點擊,然後我將SendMessage發送到鼠標下的窗口 – magol

0

如果我明白你是什麼那麼之後就可以通過的SendKeys代碼放在鼠標點擊事件或使用System.Windows.Form.SendKeys一些腳本 - >發送({} KeyBoardKey)

文檔:http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

+0

我正在使用http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v= vs.85%29.aspx發送輸入。但這不是問題。問題在於我忽略了通過低級別鼠標鉤子接收到的鼠標點擊後發送輸入。 – magol

0

如果您的屏幕鍵盤應用程序是與舊應用程序分開的過程,那麼它應該相當容易。

在你的鍵盤應用程序中,你知道用戶點擊了哪個鍵。那麼你所要做的就是使用SendMessage()API將這些信息傳遞給舊版應用程序。

你說物理鍵盤發送ESC和字母?所以你需要查找一些鍵盤按鍵來命令序列。

此外,您還需要獲取遺留應用程序的HWND,您可以使用FindWindow()/ FindWindowEx()API進行操作。我認爲應用程序將有一個獨特的自定義類名,這應該很容易。如何發送郵件使用SendMessage函數(命令序列字符)這裏

詳情:

Sending an application keystrokes with "SendMessage" (vb.net)

相關問題