Windows.h - 焦点进入文本输入时的通知

2024-04-15

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

到目前为止我一直在探索SetWinEventHook with EVENT_OBJECT_FOCUS and GetGUIThreadInfo with GUI_CARETBLINKING.

来自文档:

事件对象焦点

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

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
    }


}

这在某些情况下似乎确实有效,但绝对不可靠。像记事本和 IE 这样的程序似乎运行良好,但像 Firefox 这样的程序则不然。这也不适用于网站上的文本字段之类的东西,因为它看起来不像handleEventObjectFocus会被叫到。

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

Thanks!

edit

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


如果您使用标准 Windows 控件WM_SETFOCUS http://msdn.microsoft.com/en-us/library/windows/desktop/ms646283%28v=vs.85%29.aspx应该可以解决问题。无需花哨挂钩等。

编辑:对于系统范围的行为,您可以查看设置WindowsHookEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx。要捕获系统范围内的事件,您需要在 DLL 中使用它。您可以使用钩子组合,其中包括捕获 WM_SETFOCUS 的钩子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows.h - 焦点进入文本输入时的通知 的相关文章

随机推荐