【发布时间】:2011-09-20 04:41:50
【问题描述】:
启动 XNA 游戏时,白屏会快速闪烁。在较慢的机器上,这比在较快的机器上更明显。我们使用 WPF 开发的菜单系统开发游戏套装。此菜单启动我们的 XNA 游戏并将其窗口设置为前景窗口(仅当它本身具有焦点时才有效)
我们遇到的问题是,如果玩家在开始游戏后一直按左键,系统就会卡在这个白屏闪烁中。屏幕保持白色,玩家无法用鼠标退出此屏幕(alt-tab 有效,但不受欢迎)。
如何防止这种情况发生?我确实想将 XNA 游戏设置为前台窗口,因为根据玩家单击的位置,菜单系统可能会保持活动状态。
这是启动 XNA 游戏的菜单系统的代码。
var process = Process.Start(info);
var currentProcess = Process.GetCurrentProcess();
while (!process.HasExited)
{
Thread.Sleep(50);
if (GetForegroundWindow() == currentProcess.MainWindowHandle)
{
Activate(process.MainWindowHandle);
}
}
这是将 XNA 游戏设置为前台窗口的代码。
/// <summary>
/// Sets the window to be foreground
/// </summary>
[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);
/// <summary>
/// Activate or minimize a window
/// </summary>
[DllImportAttribute("User32.DLL")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_SHOW = 5;
private const int SW_MINIMIZE = 6;
private const int SW_RESTORE = 9;
/// <summary>
/// The GetForegroundWindow function returns a handle to the foreground window.
/// </summary>
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
private static void Activate(IntPtr windowHandle)
{
ShowWindow(windowHandle, SW_RESTORE);
SetForegroundWindow(windowHandle);
}
谢谢, 沃特
【问题讨论】: