主に各プロセスが独自のメモリ空間で実行されるため、これを行う簡単な方法はありません。ただし、「偽装」することはできます。最初に行う必要があるのは、ウィンドウへのハンドルを見つけることです。
Process[] processes = Process.GetProcessesByName("appName");
Process p = processes.FirstOrDefault();
IntPtr windowHandle;
if (p != null)
{
windowHandle = p.MainWindowHandle;
}
ハンドルを取得したら、ウィンドウが存在する画面の領域を取得できます。
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
RECT rect = new RECT();
GetWindowRect(windowHandle, ref rect);
これにより、ウィンドウの位置がわかります。注意すべきことの 1 つは、これを実行するときにアプリケーションが最小化されている場合、-32000 などの値が得られることです。その理由を知りたい場合は、こちらをお読みください。ウィンドウの位置がわかったので、アプリケーションで、アプリケーションのフォームのサイズを他のアプリケーションと同じサイズに変更し、アプリケーションの上に配置できます。
this.Location = new Point(rect.Left, rect.Top);
this.Size = new Size(rect.Right - rect.Left, rect.Bottom - rect.Top);
これで、アプリケーションが他のアプリケーションの上に直接配置され、他のアプリケーションと同じサイズにサイズ変更されました。最後に、アプリケーションを「透過的」にする必要があります。
this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;
this.FormBorderStyle = FormBorderStyle.None;
私はそれをテストしていませんが、これでうまくいくはずです。フォームに必要なテキスト ボックスまたはラベルを追加すると、アプリケーションが「オーバーレイ」されます。これがうまくいくことを願っています!