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

时间:2013-01-18 03:13:02

标签: c++ windows winapi

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

到目前为止,我一直在探讨SetWinEventHook EVENT_OBJECT_FOCUSGetGUIThreadInfo 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,永远不会集中精力。

3 个答案:

答案 0 :(得分:1)

如果您正在使用标准Windows控件,WM_SETFOCUS应该可以解决问题。没必要喜欢挂钩等。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以使用EN_SETFOCUS通知抓住文本字段的入口。

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

编辑:你想要一个系统范围的行为并不完全清楚。在这种情况下,您必须使用钩子(参见SetWindowsHookEx),如上面的答案所述。遗憾。