C # Привязка формы наложения к позиции другого окна

Я делаю надстройку для игры, но хочу, чтобы она располагалась как наложение в клиентской области окна игры.

Обычно, когда я запускаю надстройку, я хочу, чтобы она отображалась поверх игры. Загвоздка в том, что если вы сворачиваете или перемещаете окно, я хочу, чтобы форма оставалась неизменной.

Кто-нибудь знает что-нибудь, что может сделать трюк без необходимости подключать прямую отрисовку?

Спасибо.


person Community    schedule 18.09.2009    source источник
comment
Эта игра - отдельное приложение или это ваше приложение, и вы пытаетесь добавить к нему еще одну плавающую форму?   -  person MusiGenesis    schedule 18.09.2009
comment
Кроме того, если это отдельное приложение, они предоставляют API плагина или вы пишете это полностью вне игры?   -  person Eric J.    schedule 18.09.2009
comment
Это отдельное приложение без API. По сути, я просто создаю форму, которая подключается к каналу IRC, чтобы общаться с другими людьми во время игры.   -  person    schedule 18.09.2009


Ответы (1)


Вот простой способ сделать это. Во-первых, вам понадобится эта строка в операторах 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