IsIconic() 总是返回 false 而 OpenIcon() 从不打开窗口

Max*_*and 5 c++ windows winapi windows-7-x64

平台:Windows 7 64位。

首先,Windows API IsIconic()总是返回 false。窗口最大化正常还是最小化都没有关系(其中IsIconic() should return true).

该窗口属于另一个进程,并已通过以下命令检索:enumWindows() 这是我的测试代码的一小段摘录。

TCHAR WndCaption[100];
TCHAR NewCaption[] = TEXT("My Window handle is valid");
BOOL res;

GetWindowText(MyHWND,WndCaption,100);
SetWindowText(MyHWND,NewCaption);

// This always return 0, no matter what state the window is in.
res = IsIconic(MyHWND);
if(res) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

I know the window handle is valid because I can get and set the window's caption text. The Is Iconic() function however always return 0 (false) even when the window has been minimized.

But if we change the IsIconic() to IsWindowVisible() it reports correctly false when the window is minimized and true when it is maximized or normal.

TCHAR WndCaption[100];
TCHAR NewCaption[] = TEXT("My Window handle is valid");
BOOL res;

GetWindowText(MyHWND,WndCaption,100);
SetWindowText(MyHWND,NewCaption);

// This works correctly.
res = IsWindowVisible(MyHWND);
if(!res) {
   // This always fail
   OpenIcon(MyHWND);
}
Run Code Online (Sandbox Code Playgroud)

So now when I can detect the window being minimized I want to restore it. IsIconic's counterpart OpenIcon() does nothing. It returns true, telling that the operation was successful, but the window is still minimized. In fact, it always return true no matter what state the window is in.

So lets try the old fashion way.

TCHAR WndCaption[100];
TCHAR NewCaption[] = TEXT("My Window handle is valid");
BOOL res;

GetWindowText(MyHWND,WndCaption,100);
SetWindowText(MyHWND,NewCaption);

// Only works if the window wasn't minimized by clicking the minimize button
res = ShowWindow(MyHWND,SW_MINIMIZE);
res = ShowWindow(MyHWND,SW_NORMAL);
res = ShowWindow(MyHWND,SW_MAXIMIZE);
Run Code Online (Sandbox Code Playgroud)

如果窗口处于正常最大化状态,它将首先最小化它,再次恢复它,然后最大化它。但是,如果我在通过单击最小化按钮最小化窗口时运行该程序,则不会发生任何情况。它不会恢复它或最大化它。

如果我通过单击最小化按钮将窗口最小化,感觉窗口会变得没有响应。经过几个小时的搜索,我只找到了类似问题的帖子,但没有解决方案。

有人可以帮我弄清楚如何在通过最小化按钮最小化窗口(由另一个进程拥有)后恢复它吗?

Rem*_*eau 0

在不了解有关外部应用程序的任何信息的情况下,我的猜测是您正在操作的窗口不是最小化到任务栏的实际窗口,这可以解释为什么IsIconic()总是错误但IsWindowVisible()有所不同。

这种情况并不罕见,尤其是在 Vista 之前编写的遗留应用程序中,或者在更新为支持 Vista 之前使用旧版本框架(如 Borland 的 VCL)的应用程序中,拥有一个顶级隐藏窗口,该窗口拥有同一应用程序中的其他窗口,尤其是主窗口。其中一个原因是在 Microsoft 创建 API 来控制同一任务栏按钮之前将多个窗口分组到同一个任务栏按钮上。

在这样的应用程序中,当“主”窗口“最小化”时,应用程序将拦截该操作,隐藏“主”窗口,并最小化所有者窗口。当“主”窗口“恢复”时,应用程序将恢复所有者窗口,然后显示“主”窗口。

尝试检查是否GetWindow(MyHWND, GW_OWNER)返回一个HWND,如果是,则检查IsIconic()有关它的说明。

Vista 对应用程序与任务栏和 Alt+Tab 对话框的交互方式进行了一些重大更改。一些自 Win95 以来一直正确且工作正常的编码技术和假设在 Vista 中不再正常工作。有些应用程序和框架适应了这些变化,有些则没有。