GetWindow(GetForegroundWindow()失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GetWindow(GetForegroundWindow()失败相关的知识,希望对你有一定的参考价值。

到目前为止,我尝试使用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);
}
答案

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

MSDN还说:

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

以上是关于GetWindow(GetForegroundWindow()失败的主要内容,如果未能解决你的问题,请参考以下文章

怎样在android的service中调用Activity中的getWindow函数

Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie

Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie

Delphi获得一个进程的主窗体(GetWindow(AHandle, GW_OWNER)等于0的窗体才是主窗体,并且要IsWindowVisible排除Application窗口)

使用代码设置activity为透明

使用代码设置activity为透明