[英]Detect Edit Control Focus and Insert Characters
我正在用C ++ WinAPI開發虛擬鍵盤。 顯然,它需要知道Edit控件何時具有焦點,以便它可以顯示虛擬鍵盤(VK)窗口。 當用戶按下VK中的一個鍵時,程序需要將該字符插入另一個進程的Edit控件中。 這些存在安全隱患,甚至在Windows OS中是不可能的。 因此,我的問題...
是否可以知道另一個進程中的Edit控件何時具有焦點? 我認為掛鈎可能是解決方案。 使用全局掛鈎確實存在安全隱患,有什么辦法我可以對操作系統專門說“僅告訴我類型為“編輯”的控件具有焦點時”嗎? 還有我不知道的另一種方法嗎?
是否可以在其他進程的Edit控件中插入字符? 這再次提出了安全/禮節方面的問題。
是否可以知道另一個進程中的Edit控件何時具有焦點?
是的,但不是直接的。 您確實確實需要通過SetWindowsHookEx()
或SetWinEventHook()
進行鈎子。
使用SetWindowsHookEx()
,要掛接其他進程,必須在DLL中實現掛接(對於32位和64位系統,則必須使用單獨的DLL)。 您可以使用WH_CBT
鈎子查找HCBT_SETFOCUS
通知,也可以使用WH_CALLWNDPROC
鈎子查找WM_SETFOCUS
/ WM_KILLFOCUS
窗口消息。
使用SetWinEventHook()
,不需要DLL即可掛接其他進程。 您可以注冊接收EVENT_OBJECT_FOCUS
事件(不過,我沒有看到用於檢測焦點丟失的鈎子事件)。
有什么辦法可以我只對操作系統說“僅告訴我類型為“編輯”的控件具有焦點時”嗎?
不能。要專門過濾掉Edit控件,您的鈎子需要在提供的HWND
上調用GetClassName()
來查找已知的Edit類(並非所有Edit控件都被命名為"EDIT"
)。
是否可以在其他進程的Edit控件中插入字符?
是。 您可以使用SendInput()
或keybd_event()
將擊鍵發布到鍵盤驅動程序本身發布到的相同輸入隊列中。 只要“編輯”控件保持焦點,它就會接收到擊鍵,就像用戶正常鍵入它們一樣。 這是首選方法。
但是,這些鈎子確實為您提供了Edit控件的HWND
,因此您可以將WM_KEYDOWN
/ WM_CHAR
/ WM_KEYUP
消息直接發送到Edit控件(但是,請注意這些陷阱: 您不能使用PostMessage模擬鍵盤輸入 ,並且通過WM_CHAR消息模擬輸入可能會偽造收件人,但不會偽造輸入系統 )。 或者,您可以將WM_GETTEXT
/ WM_SETTEXT
消息發送到Edit控件,或通過AccessibleObjectFromWindow()
檢索其IAccessible
接口,以根據需要操縱Edit控件的文本內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.