Вот простой способ сделать это. Во-первых, вам понадобится эта строка в выражениях 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, чтобы определить, когда игровая форма минимизирует или перемещает или изменяет размер, но этот метод опроса будет выполнять почти то же самое намного проще.
Последний бит : FindWindow вернет 0, если не найдет окно с таким заголовком, так что вы можете использовать его, чтобы закрыть собственное приложение, когда игра закрыта.