Вот простой способ сделать это. Во-первых, вам понадобится эта строка в операторах using вашей формы:
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» в последней строке.
Более сложный метод включал бы перехват сообщений Windows, чтобы определить, когда игровая форма минимизируется, перемещается или меняет размер, но этот метод опроса будет выполнять почти то же самое намного проще.
И последнее.
person
MusiGenesis
schedule
18.09.2009