IsIconic()始终返回false,OpenIcon()从不打开窗口

时间:2014-10-14 05:04:47

标签: c++ windows winapi windows-7-x64

平台:Windows 7 64位。

首先,Windows API IsIconic()始终返回false。窗口是否最大化正常最小化(其中IsIconic()应该返回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) {
    ...
}

我知道窗口句柄是有效的,因为我可以获取并设置窗口的标题文本。但是,Is Iconic()函数总是返回0(false),即使窗口已最小化

但是,如果我们将IsIconic()更改为IsWindowVisible(),则当窗口最小化时,它会正确报告错误,而当最大化时或< EM>正常

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);
}

所以现在当我能够检测到最小化的窗口时,我想恢复它。 IsIconic的对手OpenIcon()什么都不做。它返回true,表示操作成功,但窗口仍然最小化。实际上,无论窗口处于什么状态,它总是返回true。

所以让我们试试旧式的方式。

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);

如果窗口处于正常最大化状态,它将首先将其最小化,再次将其恢复,然后将其最大化。但是如果我通过单击最小化按钮来最小化窗口时运行程序,则没有任何反应。它无法恢复或最大化它。

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

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

2 个答案:

答案 0 :(得分:0)

在不知道有关外部应用程序的任何内容的情况下,我的猜测是您正在操作的窗口不是最小化到任务栏的实际窗口,这将解释为什么IsIconic()始终为false但{{1变化。

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

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

尝试检查GetWindow(MyHWND, GW_OWNER)是否返回IsWindowVisible(),如果是,请检查HWND对此的说明。

Vista对应用程序与任务栏和Alt + Tab对话框的交互方式做了一些重大改变。自Win95以来,一些编码技术和假设已经真实并且工作正常,在Vista之后不再正常工作。一些应用程序和框架适应了这些变化,有些则没有。

答案 1 :(得分:0)

在Windows 7 Pro中有类似的问题。 32位。

IsIconic()函数来自user32.dll。

将以下文件复制到当前文件夹后,IsIconic功能正常工作。 user32.dll,advapi32.dll,gdi32.dll,kernel32.dll,ntdll.dll

注意: 这些依赖项可以在VC 6.0 ++中找到usnig DEPENDS.EXE。这些文件也是从Windows 7 64位PC复制的(IsIconic在这台电脑上工作正常)。

可能是Windows 7 32位PC上没有安装Windows更新。