2009-05-29 78 views
2

我正在研究需要記錄和回放擊鍵的程序。主進程作爲服務運行,所以它需要一個配置程序來記錄擊鍵。如何確定另一個進程(Windows)的鍵盤佈局?

當系統默認的鍵盤佈局是(比如說)英語,並且用戶的鍵盤佈局是德語時,會出現問題。用戶在配置界面輸入一個'ü'字符,該字符被正確記錄和存儲。

現在用戶運行記事本並嘗試播放按鍵,這是由服務的子級完成的。當轉換輸入到SendInput時,我們調用VkKeyScan,然後告訴我們無法在此鍵盤上重現該字符(請記住默認的鍵盤佈局是英語)。

我最想做的是同步服務的鍵盤佈局和當前的前臺應用程序,這樣服務可以重現用戶可以用鍵盤輸入的任何字符。 GetKeyboardLayout僅適用於當前進程。這必須在32位和64位上運行,所以消息鉤是...不是首選:)。

回答

5

要爲前臺窗口獲取鍵盤佈局:

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) 

這聽起來像你錄製字符,而不是按鍵。您可以使用SendMessage將WM_CHAR消息與記錄的字符一起發送,而不是生成擊鍵,而不是在重放時發送擊鍵。

+0

這不會從服務中工作(當然,它可以從交互式服務中使用,但不推薦使用交互式服務,並且在新版本的Windows下不起作用)。 – jdigital 2009-06-05 18:11:12