アジョブジ星通信

進捗が出た頃に更新されるブログ。

キャプションバーのアイコンのメニューに項目を追加する

久しぶりのブログですね、デザインいじったりしたけど記事書いてませんでした(^^ゞ

f:id:azyobuzin:20110603223507p:image:w320:right
こんな感じのが作りたかったわけです。裏の画面は画面だけで何も実装してませんよ( ̄▽ ̄)

まずは参考にしたページの紹介

大量ですね!このページ達でのサンプルを合わせた結果が今回のブツなわけです。早速コードを
次のをウィンドウのコードビハインドに書きます。

[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で済ませよう!ということでやったらうまくいきました。なかなかないよこんな素直なこと!
というわけで久々にネタにできるようなコードが書けたとさめでたしめでたし