ゲームのアドオンを作成していますが、ウィンドウのゲームのクライアント領域へのオーバーレイとして常駐させたいと考えています。
基本的に、アドオンを開始すると、ゲームの上に表示されます。問題は、ウィンドウを最小化または移動した場合、フォームをウィンドウに固定したいということです。
directdraw をフックせずにトリックを実行できることを知っている人はいますか?
ありがとう。
これを行う簡単な方法を次に示します。まず、フォームの 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 メッセージをフックして、ゲーム フォームがいつ最小化、移動、またはサイズ変更されるかを判断する必要がありますが、このポーリング方法は、ほぼ同じことをより簡単に実現します。
最後に 1 つ: FindWindow は、そのタイトルのウィンドウが見つからない場合は 0 を返すため、ゲームを閉じたときにこれを使用して独自のアプリケーションを閉じることができます。