[英]How to detect whether the focused window is an Edit 'type' control?
如何检测聚焦窗口是否为“编辑”类型控件? 我知道的一种方法是使用Microsoft Active Accessibility ,使用该方法看起来会涉及很多工作。
我可以使用另一种更简单的方法吗?
我的用例是:当编辑控件具有焦点时,存储该hwnd
。
// Callback set by SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, (WINEVENTPROC)&winEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
void CALLBACK KeyboardComponent::winEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject,
LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
// if hwnd == "Edit Control" store hwnd to send key input events
// One technique but not comprehensive
TCHAR wndClassName[255];
GetClassName(hwnd, wndClassName, 255);
if (_tcsicmp(wndClassName, _T("edit")) == 0)
targetEdit = hwnd;
// Class names I am receiving are subclassed or new window classes that look and operate like Edit controls.
// Ie when clicking the Firefox address bar I get: MozillaWindowClass
// Ie when clicking the Chrome address bar I get: Chrome_WidgetWin_1
}
主动辅助功能是正确的解决方案。 您可以使用AccessibleObjectFromEvent()
来获取HWND
的IAccessible
接口,该接口将触发您的winEventProc
挂钩,然后检查ROLE_SYSTEM_TEXT
的IAccessible::AccRole
属性:
ROLE_SYSTEM_TEXT
该对象表示允许编辑的可选文本,或被指定为只读。
例如:
// Callback set by SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, (WINEVENTPROC)&winEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
void CALLBACK KeyboardComponent::winEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject,
LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
IAccessible* pAcc = NULL;
VARIANT varChild;
HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild);
if ((hr == S_OK) && (pAcc != NULL))
{
VARIANT varRole;
hr = pAcc->get_accRole(varChild, &varRole);
if ((hr == S_OK) && (varRole.vt == VT_I4) && (varRole.lVal == ROLE_SYSTEM_TEXT))
{
// ...
}
pAcc->Release();
}
}
为了获得可靠的结果,请尝试使用RealGetWindowClass
,它应该处理window子类化的情况。 如果您不在乎,请使用常规的GetClassName
。
如果您要处理不是从标准Edit类派生的控件,那么这些都不起作用。
您可以使用此代码来了解焦点窗口是否为“编辑”控件
CWnd* pControl;
pControl = this->GetFocus();
if(pControl->IsKindOf(RUNTIME_CLASS(CEdit))){
//----
-----
----//
}
在这里获取更多详细信息
转换Cwnd
到HWND
pControl->GetSafeHwnd();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.