【发布时间】:2013-01-01 17:54:13
【问题描述】:
我正在尝试提出一种解决方案,用于在焦点进入文本字段时设置通知。最终目标是使用屏幕键盘重新创建您在移动设备上看到的功能类型。
到目前为止,我一直在探索 SetWinEventHook 和 EVENT_OBJECT_FOCUS 和 GetGUIThreadInfo 和 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,永远不会有自己的焦点。
【问题讨论】:
-
您实施的解决方案几乎是可靠的。它适用于 Windows 控件,但不适用于任何自定义控件实现。例如,Firefox 使用 Qt 作为其 GUI,它根本不使用 Windows 控件,而是实现了所有逻辑和呈现本身。