我正在为游戏添加一个内容,但我希望它作为窗口的游戏客户区的叠加层驻留。
基本上当我开始添加时,我想让它显示在游戏之上。问题是如果你最小化或移动窗口,我希望表单坚持下去。
任何人都知道有什么可以做到这一点而不必挂钩直接抽牌?
感谢。
答案 0 :(得分:5)
这是一种简单的方法。首先,您需要在表单的使用语句中使用此行:
using System.Runtime.InteropServices;
接下来,将这些声明添加到表单中:
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int X;
public int Y;
public int Width;
public int Height;
}
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
接下来,将表单的TopMost属性设置为True。最后,向表单添加一个Timer控件,将其Interval属性设置为250,将Enabled属性设置为True,并将此代码放入其Tick事件中:
IntPtr hWnd = FindWindow(null, "Whatever is in the game's title bar");
RECT rect;
GetWindowRect(hWnd, out rect);
if (rect.X == -32000)
{
// the game is minimized
this.WindowState = FormWindowState.Minimized;
}
else
{
this.WindowState = FormWindowState.Normal;
this.Location = new Point(rect.X + 10, rect.Y + 10);
}
如果游戏没有最小化,此代码将使您的表单保持在游戏表单上,或者如果游戏最小化,它将最小化您的表单。要更改应用程序的相对位置,只需更改最后一行中的“+ 10”值。
更复杂的方法包括挂钩窗口消息以确定游戏形式何时最小化或移动或改变大小,但这种轮询方法将更简单地完成几乎相同的事情。
最后一位:如果找不到具有该标题的窗口,FindWindow将返回0,因此您可以在游戏关闭时使用它来关闭自己的应用程序。