5

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

到目前为止,我一直在探索SetWinEventHookwithEVENT_OBJECT_FOCUSGetGUIThreadInfowith GUI_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,永远不会有自己的焦点。

4

3 回答 3

1

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

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

于 2013-01-18T06:15:08.897 回答
1

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

于 2013-01-18T15:32:24.477 回答
0

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

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

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

于 2013-01-18T06:41:58.190 回答