簡體   English   中英

檢測編輯控件焦點並插入字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM