WinAPI - 确定窗口是否具有最大化/恢复功能

时间:2018-01-14 08:41:03

标签: java c# c++ windows winapi

问题:确定窗口(例如,hWnd)是否具有最大化或恢复的能力。这样做的目的是以编程方式将最大化/恢复事件发送到窗口(用于自动化),但排除无法处理它的窗口。

尝试使用GWL_STYLE从GetWindowLong确定此窗口时,请考虑以下两个示例窗口:

a)Discord客户端应用程序(使用Electron构建)。它有风格:

  • WS_CAPTION
  • WS_SIZEBOX

NOT 有样式:

  • WS_SYSMENU
  • WS_MAXIMIZEBOX

此窗口会显示恢复/最大化按钮,并在向其发布SW_MAXIMIZE / SW_RESTORE时正常运行。

b)"你确定要退出吗?"提示在InteliJ IDEA。它有风格:

  • WS_CAPTION
  • WS_SIZEBOX
  • WS_SYSMENU

NOT 有样式:

  • WS_MAXIMIZEBOX

此窗口不显示恢复/最大化按钮,并且当SW_MAXIMIZE / SW_RESTORE发布到它时它不能正常运行(它会崩溃整个IDE)。

因此,鉴于这两个例子,以下事实是正确的:

1)窗口 WS_SIZEBOX样式可能无法正确响应SW_MAXIMIZE / SW_RESTORE消息(不是为了设计);

2)一个窗口没有 WS_SYSMENU也没有WS_MAXIMIZEBOX 可能仍然正确响应SW_MAXIMIZE / SW_RESTORE消息(以非标准方式绘制系统菜单和/或按钮本身)

3)它们都有一个本机系统菜单,通过标题栏二次点击打开,它们正确地列出最大/恢复为启用或禁用(无论匹配它们的能力)。

鉴于这两个事实,我如何确定窗口是否可以处理最大化/恢复?似乎单独使用窗口样式是不可能的,但我无法在 Win32 API WinAPI中找到任何内容来执行此操作。

请注意,我决定是否通过调用GetWindowPlacement并检查showCmd来发送SW_MAXIMIZE / SW_RESTORE。

另请注意,我使用的是Java / JNA,但如果您想共享代码段,我完全理解C ++或C#。

1 个答案:

答案 0 :(得分:0)

我发现作为最后的手段,我可​​以使用GetSystemMenu> GetMenuItemInfo检查是否启用了Restore或Maximize系统菜单项。因此,如果窗口因任何原因没有WS_MAXIMIZEBOX样式,那么这是一个不错的回退。

相关问题