2010-01-01 51 views
3

我有一個用C++編寫的win 32應用程序,它設置低級別的鍵盤鉤子。現在我想sendInput任何應用程序,如單詞/記事本。我該怎麼做呢?創建SendInput時會調用全局低級別鍵盤掛鉤。如何預防它?

我已經做了足夠的使用findwindow/sendmessage。對於所有這些,我需要知道編輯控件。找到編輯控件是非常困難的。

因爲SendInput適用於任何Windows應用程序,所以我想使用它。問題是我用按鍵獲得了對我的回調函數的調用。

例如,我按A並且我想將U + 0BAF unicode字符發送到活動的應用程序窗口。在這種情況下,假設它是記事本。

問題是我在記事本中得到了兩個字符U + 0BAF和A.

A正在發送,因爲我打電話CallNextHookEx(NULL,nCode,wParam,lParam);

如果我在sendInput後返回1,則沒有任何內容發送到記事本。

有什麼建議嗎?

回答

2

如果我理解正確的問題,您應該忽略「注入」你的鉤子過程中的關鍵事件
這樣的:

LRESULT CALLBACK 
hook_proc(int code, WPARAM wParam, LPARAM lParam) 
{ 
    KBDLLHOOKSTRUCT* kbd = (KBDLLHOOKSTRUCT*)lParam; 

    // Ignore injected events 
    if (code < 0 || (kbd->flags & 0x10)) { 
    return CallNextHookEx(kbdhook, code, wParam, lParam); 
    } 
    ... 

更新:另外,你必須字符,並通知一些其他例程
用於通過Windows消息按下字符。

例子:

... 
// Pseudocode 
if (kbd->vkCode is character) { 
    if (WM_KEYDOWN == wParam) { 
    PostMessage(mainwnd, WM_MY_KEYDOWN, kbd->vkCode, 0); 
    return 1; // eat the char, ie 'a' 
    } 
} 
return CallNextHookEx(kbdhook, code, wParam, lParam); 

而在其他一些模塊你處理WM_MY_KEYDOWN

ie, #define WM_MY_KEYDOWN (WM_USER + 1) 

,並調用相應的程序,將產生新的關鍵事件。

+0

我以前試過。我仍然得到兩個字符:( ,如果我按鍵'a'和我發送的相應的鍵是அ(U + 0B8A) 但我在記事本 – coder 2010-01-01 12:46:06

+0

@coder'அa',看到我的更新。我認爲這是最好的解決方案,但它可能會解決你的問題 – 2010-01-01 13:31:05

+0

嘿, 它的工作,事情是我除了包括你給我的線以外捕獲幾件事 我必須返回1在最後爲了防止字符被顯示,我在我的if else語句中返回了CallNextHookEx,其中包含sendinput的代碼。 – coder 2010-01-01 13:46:32