C # «Блокировка» оверлейной формы в положение другого окна - PullRequest
3 голосов
/ 18 сентября 2009

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

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

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

Спасибо.

1 Ответ

5 голосов
/ 18 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...