gpt4 book ai didi

c++ - 检测编辑控制焦点和插入字符

转载 作者:行者123 更新时间:2023-11-30 03:43:00 25 4
gpt4 key购买 nike

我正在使用 C++ WinAPI 开发虚拟键盘。它显然需要知道 Edit 控件何时获得焦点,以便它可以显示虚拟键盘 (VK) 窗口。而当用户按下 VK 中的某个键时,程序需要将该字符插入到另一个进程的 Edit 控件中。这些存在安全问题,甚至在 Windows 操作系统中可能无法实现。因此我的问题...

  • 是否有可能知道另一个进程中的 Edit 控件何时获得焦点?我认为钩子(Hook)可能是解决方案。使用全局 Hook 确实存在安全问题,有没有一种方法可以让我专门对操作系统说“仅当‘编辑’类型的控件具有焦点时才告诉我”?还有其他我不知道的方法吗?

  • 是否可以将字符插入到另一个进程的 Edit 控件中?这又会带来安全/礼仪问题。

最佳答案

Is it possible to know when an Edit control in another process has the focus?

是的,但不是直接的。你确实需要一个钩子(Hook),要么通过 SetWindowsHookEx()SetWinEventHook() .

使用 SetWindowsHookEx(),为了 Hook 其他进程,您必须在 DLL 中实现您的 Hook (以及用于 32 位和 64 位系统的单独 DLL)。您可以使用 WH_CBT Hook 寻找 HCBT_SETFOCUS 通知,或 WH_CALLWNDPROC钩子(Hook)寻找 WM_SETFOCUS/WM_KILLFOCUS窗口消息。

使用 SetWinEventHook(),您不需要 DLL 来 Hook 其他进程。您可以注册接收EVENT_OBJECT_FOCUS事件(不过,我没有看到用于检测失去焦点的 Hook 事件)。

is there a way I can just specifically say to the OS 'only tell me when a control of type 'Edit' has the focus'?

没有。要专门过滤掉编辑控件,您的 Hook 需要调用 GetClassName()在提供的 HWND 上查找已知的编辑类(并非所有编辑控件都命名为 "EDIT")。

Is it possible to insert characters into another processes Edit control?

是的。您可以使用 SendInput()keybd_event()将击键发送到键盘驱动程序本身发送到的相同输入队列。只要 Edit 控件保持焦点,它就会接收击键,就像用户正常键入一样。这是首选方法。

但是, Hook 确实为您提供了编辑控件的 HWND,因此您可以发送 WM_KEYDOWN/WM_CHAR/WM_KEYUP直接向 Edit 控件发送消息(但是,请注意这些问题:You can’t simulate keyboard input with PostMessageSimulating input via WM_CHAR messages may fake out the recipient but it won’t fake out the input system)。或者,您可以发送 WM_GETTEXT/WM_SETTEXT向 Edit 控件发送消息,或检索其 IAccessible接口(interface)通过 AccessibleObjectFromWindow() , 根据需要操作编辑控件的文本内容。

关于c++ - 检测编辑控制焦点和插入字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com