fra*_*cis 5 c++ windows winapi
我正在尝试提供一个解决方案,用于在焦点进入文本字段时设置通知.最终目标是重新创建您在屏幕键盘的移动设备上看到的功能类型.
到目前为止,我一直在探索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
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎在某些情况下有效,但它绝对不可靠.像Notepad和IE这样的程序似乎工作得很好,但像Firefox这样的程序却没有.这也不适用于网站上的文本字段之类的内容,因为它看起来handleEventObjectFocus不会被调用.
有谁知道另一种方法来解决这个问题?我一直在寻找,似乎我可能正在寻找辅助功能API中的东西,但我还没有深入了解它.
谢谢!
编辑
为了澄清,我希望在焦点进入任何文本字段时收到通知.这个应用程序是一个win32 dll,永远不会集中精力.
如果您使用标准 Windows 控件WM_SETFOCUS应该可以解决问题。无需花哨挂钩等。
编辑:对于系统范围的行为,您可以查看SetWindowsHookEx。要捕获系统范围内的事件,您需要在 DLL 中使用它。您可以使用钩子组合,其中包括捕获 WM_SETFOCUS 的钩子。
| 归档时间: |
|
| 查看次数: |
1441 次 |
| 最近记录: |