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

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

平台:Windows 7 64 位。

首先,Windows API IsIconic()总是返回错误。窗口是最大化正常 还是最小化 无关紧要(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(假),即使窗口已被最小化

但是,如果我们将 IsIconic() 更改为 IsWindowVisible(),它会在窗口最小化 时正确报告 false,而在最小化时正确报告 true 最大化正常

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

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

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

谁能帮我弄清楚如何在通过最小化按钮将窗口最小化后恢复窗口(由另一个进程拥有)。

最佳答案

在对所讨论的外部应用程序一无所知的情况下,我的猜测是您正在操作的窗口不是最小化到任务栏的实际窗口,这可以解释为什么 IsIconic() 总是false 但 IsWindowVisible() 不同。

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

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

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

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

关于c++ - IsIconic() 总是返回 false 而 OpenIcon() 从不打开窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26352976/

相关文章:

c++ - qt Creator qt5.1 vs2010使用静态库时链接器错误

c++ - 找不到 Visual Studio 平台 2015 工具集 ='v141'

c - 如何使用临界区

c++ - 运行提升时如何创建不需要提升编辑的文件?

c++ - 可以放置一个钩子(Hook)来捕获子进程发送到控制台的消息吗?

C++ 键盘 Hook

c++ - 如何转换 CString LPStr

c++ - 对象数组参数-错误: field ‘letters’ has incomplete type

c - 如果使用 IOCP 进行基本信号传输,传递给 CreateIoCompletionPort 的句柄是什么?

windows - VS代码-: EPERM: operation not permitted错误