キャプションバーのアイコンのメニューに項目を追加する
久しぶりのブログですね、デザインいじったりしたけど記事書いてませんでした(^^ゞ
こんな感じのが作りたかったわけです。裏の画面は画面だけで何も実装してませんよ( ̄▽ ̄)
まずは参考にしたページの紹介
- タイトルバーのコンテキストメニューについて: DOBON.NETプログラミング掲示板過去ログ
- [C#/XAML] ウィンドウ ハンドルを使う (Windows フォームから WPF へ) in C#
- [C#][WPF] WPFでWndProcイベントをキャプチャーする
大量ですね!このページ達でのサンプルを合わせた結果が今回のブツなわけです。早速コードを
次のをウィンドウのコードビハインドに書きます。
[DllImport("USER32.DLL")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert); [DllImport("USER32.DLL")] private static extern bool AppendMenu(IntPtr hMenu, UInt32 uFlags, UInt32 uIDNewItem, string lpNewItem); private const UInt32 MF_BYCOMMAND = 0x00000000; private const UInt32 MF_STRING = 0x00000000; private const UInt32 MF_SEPARATOR = 0x00000800; private const int WM_SYSCOMMAND = 0x112; //ウィンドウのLoadedイベントのハンドラ private void mainWindow_Loaded(object sender, RoutedEventArgs e) { var source = HwndSource.FromVisual(this) as HwndSource; IntPtr hMenu = GetSystemMenu(source.Handle, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, string.Empty);//セパレータ AppendMenu(hMenu, MF_STRING, MF_BYCOMMAND, "メニュー項目"); source.AddHook((IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) => { if (msg == WM_SYSCOMMAND && ((uint)wParam) == MF_BYCOMMAND) { MessageBox.Show("ほげほげほむほむ"); handled = true; } return IntPtr.Zero; }); }
わからないところはIntPtr.Zeroで済ませよう!ということでやったらうまくいきました。なかなかないよこんな素直なこと!
というわけで久々にネタにできるようなコードが書けたとさめでたしめでたし