无法以编程方式最小化窗口

时间:2018-06-22 20:26:03

标签: vb.net winforms monogame

我正在尝试为我的游戏创建一个自定义的TitleBar,我可以按照我想要的其他方式工作,但是如果不使用Windows框架中的Windows按钮,就无法使其最小化。

我在构造函数中有一个Game类:

'Having this here or in the constructor doesn't make any difference
Public AsWindow As Windows.Forms.Form = CType(Windows.Forms.Form.FromHandle(Me.Window.Handle), Windows.Forms.Form)

Public Sub New()
    Window.AllowUserResizing = False
    Window.IsBorderless = True
end sub

Public Sub Minimize()
    AsWindow.WindowState = System.Windows.Forms.FormWindowState.Minimized
End Sub

调用Minimize会导致AsWindow上出现“ System.NullReferenceException”,无论我是在运行时还是在启动期间定义AsWindow。

请注意,我已添加“ System.Windows.Forms”作为参考。

我尝试过的事情:

  1. This is where i got the initial code for the AsWindow field.

  2. And here i tried to send a Message to minimize the window.

1 个答案:

答案 0 :(得分:1)

您面临的问题是MonoGame API(与XNA完全一样)不会公开控制窗口的直接方法。这样说是有道理的,因为可以说MonoGame支持没有“窗口”概念的平台。

但是,通常可以访问底层平台特定的代码并解决这些问题。但是请务必牢记,这种方法将针对特定平台,并且如果MonoGame在后台更改可能会中断。

最后我检查了一下,MonoGame在Windows桌面平台上使用SDL。这可能不再成立了,但是我在一个提供了总体思路的旧项目中确实有一些代码。我的代码在C#中,但它应该为您指明正确的方向。

第一步是从SDL.dll导入所需的方法。这个非托管代码,您无法像在.NET项目中那样正常引用它。

[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SDL_MaximizeWindow(IntPtr window);

一旦可以访问该方法,就可以通过传递窗口句柄来调用它。

SDL_MaximizeWindow(Window.Handle);

很显然,这是最大化窗口的代码(这是我手头唯一的代码),但是我敢肯定,您可以自己弄清楚如何最小化版本。