.NETでウィンドウのないウィンドウを作成するには

Create a windowless window for .NET
ウィンドウのないウィンドウというと、矛盾した言葉のように思えますが、常駐型アプリにおいてWM_HOTKEYなどのシステムから通知されるウィンドウメッセージだけを受け取るためのHWNDハンドルが必須ですが、実体のあるウィンドウは必要ないというケースがしばしばあります。

Win32 APIではCreateWindowにおいてHWND_MESSAGEを指定すれば、ウィンドウを持たないHWNDハンドルを取得することができます。.NETデスクトップではP/InvokeでCreateWindowを呼び出さなくとも、NativeWindowのサブクラスを作成すれば、簡単に実装することができます。
winless.cs
public class WinlessWindow : NativeWindow
{
	private const int WM_HOTKEY = 0x0312;

	public WinlessWindow()
	{
		CreateHandle(new CreateParams() {
			Parent = new IntPtr(-3), // HWND_MESSAGE
		});
	}

	protected override void WndProc(ref Message m)
	{
		if(m.Msg == WM_HOTKEY) {
			m.Result = IntPtr.Zero;
		}
		base.WndProc(ref m);
	}
}
2021/02/25