Tech Racho エンジニアの「?」を「!」に。
  • インフラ
  • 開発

[.NET] WPFで0x313を送るとシステムメニューを表示できる

WPFWindowsFormsに比べ、デザインを柔軟に設定できて良いですね。

また、デザインとロジックの分離がとてもやりやすいです。Visual Studio 2008のエディタがこなれていないのと、Bindingマークアップ拡張が分かりにくいのが普及を妨げている感がありますが(?)、おすすめです。

WPFでシステムメニューを表示する

さて、大した内容では無いのですが、WPFで任意のタイミングでシステムメニューを表示させる方法をご紹介します。

WPFでと言いながらWinAPIのお話で、かなり有名な内容ですが、まあ一応。

システムメニュー

システムメニュー

[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

private void Button_Click(object sender, MouseButtonEventArgs e)
{
    //マウス座標を取得し、lParamに加工
    int x = System.Windows.Forms.Control.MousePosition.X;
    int y = System.Windows.Forms.Control.MousePosition.Y;
    IntPtr lParam = new IntPtr(x | y << 16);

    //Windowハンドルを取得し、0x313メッセージを送信
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    PostMessage(hwnd, 0x313, IntPtr.Zero, lParam);
}

要するに0x313を送るだけです。これはWinUser.hにも書かれていない隠し定数ですが、いろんなところで紹介されて逆に有名な値です。0x313。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。