Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检测聚焦窗口是否为编辑窗口';类型';控制_C++_Winapi - Fatal编程技术网

C++ 如何检测聚焦窗口是否为编辑窗口';类型';控制

C++ 如何检测聚焦窗口是否为编辑窗口';类型';控制,c++,winapi,C++,Winapi,如何检测聚焦窗口是否为编辑“类型”控件?我知道的一种方法是使用这种方法,它看起来需要花费大量的精力 有没有其他更简单的方法 我的用例是:当编辑控件具有焦点时,存储该hwnd // Callback set by SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, (WINEVENTPROC)&winEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS); void CALLBACK Key

如何检测聚焦窗口是否为编辑“类型”控件?我知道的一种方法是使用这种方法,它看起来需要花费大量的精力

有没有其他更简单的方法

我的用例是:当编辑控件具有焦点时,存储该
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
}

您可以使用此代码了解聚焦窗口是否为编辑控件

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

if(pControl->IsKindOf(RUNTIME_CLASS(CEdit))){
      //----
       -----
       ----//
}
获取更多详细信息

Cwnd
转换为
HWND

pControl->GetSafeHwnd();

为了获得可靠的结果,请尝试使用
RealGetWindowClass
,它应该处理窗口被子类化的情况。如果您不关心这个问题,请使用常规的
GetClassName


如果您想处理不是从标准编辑类派生的控件,那么这些都不起作用。

主动可访问性是正确的解决方案。您可以使用获取触发
winEventProc
钩子的
HWND
接口,然后检查
ROLE\u SYSTEM\u 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();
    }
}

这只适用于使用MFC,并且所讨论的编辑是子类化的…并且适用于您自己程序中的控件。考虑到此人正在编写一个可访问性客户端,这三件事都不是这样。代码有什么问题?使用Windows API可以查看窗口类名,这正是您正在做的。我必须否决这个问题,因为如果我想要编辑类并获得编辑类,这就是我想要的。OP在理解并非所有看起来都是编辑控件的控件都是“编辑”类时遇到了问题。我不认为您真正理解您在这里做什么。谁说控件甚至被打开了。您已经找到了正确的解决方案,UI自动化。停止从中运行。您打算如何处理希望存储的
hwnd