无法以编程方式最小化 Window

Can't Programmatically Minimize Window

我正在尝试为我的游戏创建一个自定义标题栏,其他一切都按我想要的方式工作,但如果不使用 windows 中的 windows 按钮,我无法将其最小化=]帧.

我有一个游戏class,构造函数中有这些:

'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

无论我是在运行时还是在启动期间定义 AsWindow,调用最小化都会导致 AsWindow 出现 "System.NullReferenceException"。

请注意,我添加了 "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.

您面临的问题是 MonoGame API(与 XNA 完全一样)没有公开控制 window 的直接方式。这有点道理,因为 MonoGame 支持没有 "window" 概念的平台可以这么说。

但是,通常可以访问底层平台特定代码并解决这些问题。但是请务必记住,这种方法将特定于平台,如果 MonoGame 在后台发生变化,则可能会中断。

我最后查了一下,在幕后,MonoGame 在 Windows 桌面平台上使用 SDL。这可能不再是真的,但我在一个旧项目中确实有一些代码给出了一般的想法。我的代码在 C# 中,但它应该为您指明正确的方向。

第一步是从SDL.dll导入你想要的方法。此非托管代码是否不能像通常在 .NET 项目中那样引用它。

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

一旦您有权访问该方法,您就可以通过传入 window 句柄来调用它。

SDL_MaximizeWindow(Window.Handle);

显然,这是最大化 window 的代码(这是我手边唯一的代码),但我相信您可以自己弄清楚如何实现最小化版本。