【问题标题】:Detect Edit Control Focus and Insert Characters检测编辑控件焦点并插入字符
【发布时间】:2016-07-26 02:52:59
【问题描述】:

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

  • 是否可以知道另一个进程中的编辑控件何时具有焦点?我认为钩子可能是解决方案。使用全局钩子确实会带来安全问题,有没有办法我可以专门对操作系统说“只告诉我“编辑”类型的控件何时具有焦点?还有其他我不知道的方法吗?

  • 是否可以将字符插入另一个进程编辑控件?这再次提出了安全/礼仪问题。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    是否可以知道另一个进程中的 Edit 控件何时获得焦点?

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

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

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

    有没有一种方法可以让我专门对操作系统说“只告诉我“编辑”类型的控件何时获得焦点?

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

    是否可以将字符插入到另一个进程编辑控件中?

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

    但是,挂钩确实为您提供了 Edit 控件的 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)。或者,您可以向 Edit 控件发送WM_GETTEXT/WM_SETTEXT 消息,或通过AccessibleObjectFromWindow() 检索其IAccessible 接口,以根据需要操作 Edit 控件的文本内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2010-11-12
      • 2022-11-08
      • 2016-02-29
      相关资源
      最近更新 更多