GetWindow(GetForegroundWindow()失败

问题描述 投票:-2回答:1

到目前为止,我尝试使用GetWindow使用GetForegroundWindow,这总是返回NULL。当我使用GetLastError我有一个消息说1400,无效的窗口句柄。

当我第一次调试时,我之前说过有Null,但是当我重做执行时,我有一个有效的句柄,一切正常。

可能是什么问题呢。

static int CheckZOrder2Windows(HWND FirstWindow, HWND SecondWindow)
{
    int zOrderWnd1 = -1, zOrderWnd2 =-1;
    HWND tempHwnd = GetWindow(GetForegroundWindow(), GW_HWNDFIRST);
    if (!tempHwnd)
         ErrorExit(TEXT(""));
    DWORD dwFGThread1      = GetWindowThreadProcessId(FirstWindow, NULL);
    DWORD dwFGThread2      = GetWindowThreadProcessId(SecondWindow, NULL);

    int currentOrder = 0;
    DWORD dwFGThread = 0;
    while(tempHwnd)
    {
        ++currentOrder;
        if(IsWindowVisible(tempHwnd))
        {
            dwFGThread      = GetWindowThreadProcessId(tempHwnd, NULL);
            if (dwFGThread == dwFGThread1)
                zOrderWnd1 = currentOrder;

            else if (dwFGThread == dwFGThread2)
                zOrderWnd2 = currentOrder;              
        }
        tempHwnd=GetWindow(tempHwnd,GW_HWNDNEXT);
    }
    if ((zOrderWnd1 == -1) || (zOrderWnd2 == -1))
        return 0;

    return (zOrderWnd1 - zOrderWnd2);
}
c++ winapi
1个回答
3
投票

允许GetForegroundWindow返回NULL,你永远不会检查它。

MSDN还说:

Enum [Child] Windows函数比在循环中调用GetWindow更可靠。调用GetWindow执行此任务的应用程序可能会陷入无限循环或引用已销毁窗口的句柄。

© www.soinside.com 2019 - 2024. All rights reserved.