2016-04-27 98 views
-1

如何检测焦点窗口是否为编辑“类型”控件?我知道的一种方法是使用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 
} 
+2

有什么不好的代码?使用Windows API可以查看窗口类的名称,这正是您正在做的。 –

+1

我必须投票这个问题,因为,如果我想编辑类,并获得编辑类,这是我想要的。 OP有问题的理解并非所有看起来都是编辑控件的控件都是“编辑”类。 – user2120666

+1

我不认为你真的明白你在这里做什么。谁说控制甚至是开窗。你已经找到了正确的解决方案,UI自动化。停止从它跑。 –

回答

1

主动辅助功能是正确的解决方案。您可以使用AccessibleObjectFromEvent()得到一个IAccessible接口以触发您的winEventProcHWND,然后检查的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(); 
    } 
} 
-2

您可以使用此代码知道是否集中的窗口是Edit控件

CWnd* pControl; 
pControl = this->GetFocus(); 

if(pControl->IsKindOf(RUNTIME_CLASS(CEdit))){ 
     //---- 
     ----- 
     ----// 
} 

获得更多详细信息Here

转换CwndHWND

pControl->GetSafeHwnd(); 
+1

这只适用于如果您使用MFC,并且编辑问题的子类型为 –

+1

...以及您自己的程序中的控件。鉴于这个人正在编写一个可访问性客户端,三种情况都不是这种情况。 – andlabs

-1

对于可靠的结果,尝试应该使用RealGetWindowClass处理窗口被分类的情况。如果你不关心那个使用常规GetClassName

如果你想处理不是从标准的编辑类派生的控件,当然这些都不会起作用。