Window第一次忽略ShowWindow最小化,然后在每次之后服从

时间:2018-10-09 14:58:21

标签: c# winapi

我有一个C#应用程序,正在从中启动一个单独的win32窗口。我将Win32 api调用编组到我的C#应用​​程序中,并试图从中控制win32。我要从按钮按下切换窗口,使其始终在所有窗口顶部最大化或最小化。

它将最大化显示,然后忽略第一次按按钮隐藏的内容,然后在再次按下按钮时保持显示状态,然后再次以相同的代码第三次按下按钮时最终隐藏。从现在开始,它的行为符合预期。我敢肯定,某些​​Windows标志在首先经过最大化/最小化周期之前无法正确设置。

这是窗口的生命周期:

最大化创建窗口

A:

隐藏:

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

显示:

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

转到A:

我在做什么错?我已经花了几个小时尝试各种代码片段了。

谢谢!

编辑:

只需解决以下问题即可解决

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

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

代替使用ShowWindow。

1 个答案:

答案 0 :(得分:1)

根据ShowWindow()文档:

  

nCmdShow
  类型:int

     

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

     

...

     

应用程序第一次调用ShowWindow时,应使用WinMain函数的nCmdShow参数作为其nCmdShow参数。随后对ShowWindow的调用必须使用给定列表中的值之一,而不是WinMain函数的nCmdShow参数指定的值。 如对nCmdShow参数的讨论中所述,如果启动应用程序的程序在结构中指定了启动信息,则在第一次调用nCmdShow时将忽略ShowWindow值< / strong>。在这种情况下,ShowWindow使用STARTUPINFO结构中指定的信息来显示窗口。在随后的调用中,应用程序必须调用ShowWindow设为nCmdShow的{​​{1}}才能使用启动应用程序的程序提供的启动信息。此行为是为以下情况设计的:

     
      
  • 应用程序通过设置了SW_SHOWDEFAULT标志的CreateWindow来创建主窗口。

  •   
  • 应用程序通过清除WS_VISIBLE标志的情况下调用CreateWindow来创建其主窗口,然后再使用WS_VISIBLE标志将其设置为可见来调用ShowWindow

  •