.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