Java WinAPI-确定窗口是否具有最大化/还原功能

Java WinAPI-确定窗口是否具有最大化/还原功能,java,c#,c++,windows,winapi,Java,C#,C++,Windows,Winapi,问题:确定窗口(例如,hWnd)是否具有最大化或恢复的能力。其目的是以编程方式将最大化/还原事件发送到windows(用于自动化),但排除无法处理该事件的windows 请考虑以下两个示例窗口,同时尝试从GWLYType: a) Discord客户端应用程序(使用Electron构建)。它有以下几种风格: 标题 WS_SIZEBOX 它没有样式: WS\u系统菜单 WS_电子邮箱 此窗口确实显示还原/最大化按钮,并在向其发布SW_最大化/SW_还原时正常运行 b) InteliJ I

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

请考虑以下两个示例窗口,同时尝试从GWLYType:


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

  • 标题
  • WS_SIZEBOX
它没有样式:

  • WS\u系统菜单
  • WS_电子邮箱
此窗口确实显示还原/最大化按钮,并在向其发布SW_最大化/SW_还原时正常运行


b) InteliJ IDEA中提示“您确定要退出吗?”。它有以下几种风格:

  • 标题
  • WS_SIZEBOX
  • WS\u系统菜单
它没有风格:

  • WS_电子邮箱
此窗口不显示还原/最大化按钮,并且在向其发布SW_最大化/SW_还原时行为不正常(它会使整个IDE崩溃)


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

1) 带有WS_SIZEBOX样式的窗口可能无法正确响应SW_MAXIMIZE/SW_RESTORE消息(未设计)

2) 没有WS\u SYSMENU或WS\u MAXIMIZEBOX的窗口仍可能正确响应SW\u MAXIMIZE/SW\u RESTORE消息(以非标准方式绘制系统菜单和/或按钮本身)

3) 它们都有一个本机系统菜单,可通过标题栏二次单击打开,并正确地将最大化/恢复列为已启用或已禁用(与它们的功能相匹配的内容)

鉴于这两个事实,我如何实际确定窗口是否能够处理最大化/恢复?似乎单从窗口样式是不可能的,但我在Win32 API WinAPI中找不到任何东西可以做到这一点

注意,我正在通过调用并检查showCmd来决定是否发送SW_最大化/SW_还原


还注意到我使用Java/JNA,但是如果你想共享代码片段,我就理解C++或java完美。

我发现,作为最后一个手段,我可以使用GETStaseMeLoopk:GeMeNuuItMeFipe来检查是否启用了恢复或最大化系统菜单项。因此,无论出于何种原因,如果窗口没有WS_MAXIMIZEBOX样式,这是一个不错的回退。

最大化/还原功能由窗口进程处理
WM_SYSCOMMAND
包含
SC_Maximize
SC_restore
标志的消息的方式决定。存在
WS_SIZEBOX
WS_MAXIMIZE
仅允许默认窗口过程应用默认行为。“它破坏了整个IDE”听起来像个bug。所以我需要弄清楚窗口是否可以处理SCU最大化或SCU还原消息?我看到有一个GetSystemMenu函数,但我会继续挖掘,寻找一种比探测菜单更好的方法(据我所知,在Discord/Electron窗口的情况下,这可能不起作用)。我认为没有任何可靠的方法可以做到这一点。窗口进程可以由应用程序更改,或者与
WM\u SYSCOMMAND
相关的行为可能会因应用程序状态而异。当然,两者都没有
WS\u MAXIMIZE
,因为这意味着“窗口最初是最大化的”。也许您应该改为选中WS_MAXIMIZEBOX,这意味着“窗口有一个最大化按钮”。你链接到了,但是你读了吗?@VTT你可能是对的。似乎我可以使用GetSystemMenu>GetMenuState手动检查最大化/还原是否已启用或禁用,但我不可能在我的事件\系统\前台回调中执行此操作(我认为现在太早)。但是,是的,这并不能保证是可靠的-似乎我将不得不处理每个应用程序的特殊情况。