平台: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);
如果窗口处于正常或最大化状态,它将首先将其最小化,再次将其恢复,然后将其最大化。但是如果我通过单击最小化按钮来最小化窗口时运行程序,则没有任何反应。它无法恢复或最大化它。
如果我通过单击最小化按钮来最小化窗口,感觉窗口变得没有响应。 经过几个小时的搜索,我发现只有类似问题但没有解决方案的帖子。
有人可以帮助我弄清楚如何在最小化按钮最小化后恢复窗口(由另一个进程拥有)。
答案 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更新。