【问题标题】:Windows.h - Notification when focus enters a text inputWindows.h - 焦点进入文本输入时的通知
【发布时间】:2013-01-01 17:54:13
【问题描述】:

我正在尝试提出一种解决方案,用于在焦点进入文本字段时设置通知。最终目标是使用屏幕键盘重新创建您在移动设备上看到的功能类型。

到目前为止,我一直在探索 SetWinEventHookEVENT_OBJECT_FOCUSGetGUIThreadInfoGUI_CARETBLINKING

来自文档:

EVENT_OBJECT_FOCUS

一个对象已获得键盘焦点。系统发送此事件 用于以下用户界面元素:列表视图控件、菜单 栏、弹出菜单、切换窗口、选项卡控件、树视图控件和 窗口对象。

GUI_CARETBLINKING 插入符号的闪烁状态。该位被设置,如果 插入符号可见。

使用这些方法我想出了这个解决方案:

void TextInputHelper::setupEventHook(FREContext iCtx)
{
    ctx = iCtx;
    CoInitialize(NULL);

    evHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_END, NULL,
    handleEventObjectFocus, 0, 0,
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);

}


void CALLBACK handleEventObjectFocus(HWINEVENTHOOK hook, DWORD evt, HWND hwnd,
                                 LONG idObj, LONG idChild,    DWORD thread, DWORD time)
 {
    GUITHREADINFO threadInfo;
    threadInfo.cbSize = sizeof(GUITHREADINFO);

    BOOL result = GetGUIThreadInfo(thread, &threadInfo);


    if(threadInfo.flags & GUI_CARETBLINKING)
    {

        //text field focus
    }


}

这在某些情况下似乎确实有效,但绝对不可靠。 Notepad 和 IE 之类的程序似乎可以正常工作,但其他程序(例如 Firefox)则不行。这也不适用于网站上的文本字段之类的内容,因为它看起来不像 handleEventObjectFocus 会被调用。

有人知道解决这个问题的另一种方法吗?我一直在四处寻找,似乎我可能正在寻找辅助功能 API 中的一些东西,但我无法深入挖掘它。

谢谢!

编辑

为了澄清,我希望在焦点进入任何文本字段时收到通知。这个应用程序是一个 win32 dll,永远不会有自己的焦点。

【问题讨论】:

  • 您实施的解决方案几乎是可靠的。它适用于 Windows 控件,但不适用于任何自定义控件实现。例如,Firefox 使用 Qt 作为其 GUI,它根本不使用 Windows 控件,而是实现了所有逻辑和呈现本身。

标签: c++ windows winapi


【解决方案1】:

如果您使用标准 Windows 控件WM_SETFOCUS 应该可以解决问题。无需花哨的钩子等。

编辑:对于系统范围的行为,您可以查看SetWindowsHookEx。要在系统范围内捕获事件,您需要在 DLL 中使用它。您可以使用多种钩子组合,包括捕获 WM_SETFOCUS 的钩子。

【讨论】:

  • -1 如果您控制要修改的应用程序的源代码,则此方法有效。这个问题是关于增加现有应用程序的文本输入。
  • 抱歉,您需要在最初的问题中更清楚地说明这一点,请参阅编辑。
  • 感谢@demorge,Tim 是对的,我正在寻找一个全局 os 挂钩,我试图在原始问题中更清楚地说明这一点。我会在下班后阅读这个。你碰巧有什么例子吗?我在 SetWinHookEx 文档中看不到任何焦点参数
  • @demorge:我看不出SetWindowsHookExSetWinEventHook 更有能力作为在另一个进程中处理WM_SETFOCUS 消息的解决方案。既然你仍然没有解决这个问题,恐怕我不得不放弃投票。
【解决方案2】:

如果您尝试提供替代文本输入法,您应该查看“IME”-“输入法编辑器”。这些由操作系统直接支持。

【讨论】:

【解决方案3】:

您可以使用EN_SETFOCUS 通知来捕获进入文本字段的入口。

WM_FOCUS 用于窗口本身,而不是用于其中的控件。否则说,如果你想使用 WM_FOCUS,你必须继承你的 EDIT 字段。这里不需要。

编辑:您是否需要系统范围的行为并不完全清楚。在这种情况下,您必须使用上面答案中解释的钩子(参见 SetWindowsHookEx)。对不起。

【讨论】:

  • -1 此处同样适用,如果您控制要修改的应用程序的源代码,则此方法有效。这里不是这样,所以答案不是。
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2017-09-17
  • 2013-02-06
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多