【问题标题】:Window ignores ShowWindow Minimized the first time, then obeys every time after窗口第一次忽略 ShowWindow Minimized,然后每次都服从
【发布时间】:2018-10-09 14:58:21
【问题描述】:

我有一个 C# 应用程序,我正在从中启动一个单独的 win32 窗口。我正在将 Win32 api 调用编组到我的 C# 应用程序中,并试图从中控制 win32。我正在通过按下按钮来切换窗口,以便始终在所有窗口之上最大化或最小化。

它将显示为最大化,然后忽略第一次按下按钮以隐藏,然后当我再次按下按钮时它保持显示,然后在我第三次按下按钮时使用相同的代码最终隐藏。从现在开始,它的行为就如你所愿。我敢肯定,一定是某些 Windows 标志在首先经过最大化/最小化循环之前没有正确设置。

这里是窗口的生命周期:

创建最大化的窗口

答:

隐藏:

target_hwnd = FindWindowHandleByCaption()
ShowWindow(target_hwnd, SW_SHOWMINIMIZED);

显示:

target_hwnd = FindWindowHandleByCaption()
ShowWindow(target_hwnd, SW_SHOWMAXIMIZED);

转到 A:

我做错了什么?我一直在这几个小时尝试各种代码 sn-ps 无济于事。

提前致谢!

编辑:

解决了我的问题:

SendMessage(target_hwnd.ToInt32(), WM_SYSCOMMAND, SC_MINIMIZE, 0);

SendMessage(target_hwnd.ToInt32(), WM_SYSCOMMAND, SC_MAXIMIZE, 0);

而不是使用 ShowWindow。

【问题讨论】:

  • 您可能在应用创建窗口或调用 showwindow 之前过早尝试将其最小化。 Process.WaitForInputIdle() 往往会有所帮助。请注意,将样式设置为 Hidden 的 ProcessStartInfo.WindowStyle 很少起作用,程序会尽量避免困住用户并强制他们使用任务管理器来终止应用程序。一项重要的恶意软件对策。

标签: c# winapi


【解决方案1】:

根据ShowWindow() 文档:

nCmdShow
类型:int

控制窗口的显示方式。 如果启动应用程序的程序提供STARTUPINFO 结构,则应用程序第一次调用ShowWindow 时忽略此参数。否则,第一次调用ShowWindow 时,该值应该是WinMain 函数在其nCmdShow 参数中获取的值。

...

应用程序第一次调用ShowWindow,它应该使用WinMain 函数的nCmdShow 参数作为它的nCmdShow 参数。对ShowWindow 的后续调用必须使用给定列表中的值之一,而不是WinMain 函数的nCmdShow 参数指定的值。 正如在讨论 nCmdShow 参数时所指出的,如果启动应用程序的程序在结构中指定了启动信息,那么在第一次调用 ShowWindow 时会忽略 nCmdShow。在这种情况下,ShowWindow 使用STARTUPINFO 结构中指定的信息来显示窗口。在后续调用中,应用程序必须调用 ShowWindow 并将 nCmdShow 设置为 SW_SHOWDEFAULT 以使用启动应用程序的程序提供的启动信息。此行为适用于以下情况:

  • 应用程序通过调用CreateWindow 并设置WS_VISIBLE 标志来创建它们的主窗口。

  • 应用程序通过调用 CreateWindow 并清除 WS_VISIBLE 标志来创建其主窗口,然后调用 ShowWindow 并设置 SW_SHOW 标志以使其可见。

【讨论】:

  • 感谢您的澄清,但我该如何解决我的问题?我似乎无法在一帧中调用 ShowWindow 两次以使其更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多