2

ウィンドウクロムに表示されるように、システムコンテキストメニューに「常に上に」項目を追加する次のコードがあります。正常に動作しますが、オン/オフが切り替えられているかどうかを示すチェックマークなどを表示したいと思います。

どうすればこれを行うことができますか?

public RibbonShell()
{
    InitializeComponent();

    Loaded += (s,e) =>
                {
                    // Get the Handle for the Forms System Menu
                    var systemMenuHandle = GetSystemMenu(Handle, false);

                    // Create our new System Menu items just before the Close menu item
                    InsertMenu(systemMenuHandle, 5, MfByposition | MfSeparator, 0, string.Empty); // <-- Add a menu seperator
                    InsertMenu(systemMenuHandle, 6, MfByposition, SettingsSysMenuId, "Always on Top");

                    // Attach our WindowCommandHandler handler to this Window
                    var source = HwndSource.FromHwnd(Handle);
                    source.AddHook(WindowCommandHandler);
                };
}

#region Win32 API Stuff

// Define the Win32 API methods we are going to use
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32.dll")]
private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem);

/// Define our Constants we will use
private const int WmSyscommand = 0x112;
private const int MfSeparator = 0x800;
private const int MfByposition = 0x400;

#endregion

// The constants we'll use to identify our custom system menu items
private const int SettingsSysMenuId = 1000;

/// <summary>
/// This is the Win32 Interop Handle for this Window
/// </summary>
public IntPtr Handle
{
    get { return new WindowInteropHelper(this).Handle; }
}

private IntPtr WindowCommandHandler(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    // Check if a System Command has been executed
    if (msg == WmSyscommand && wParam.ToInt32() == SettingsSysMenuId)
    {
        Topmost = !Topmost;
        handled = true;
    }

    return IntPtr.Zero;
}
4

1 に答える 1

4

Topmost を変更するたびに CheckMenuItem を呼び出す必要があります。詳細については、CheckMenuItem のドキュメントを参照してください。必要な P/Invoke シグネチャと定数は次のとおりです。

[DllImport("user32.dll")] 
private static extern bool CheckMenuItem(IntPtr hMenu, Int32 uIDCheckItem, Int32 uCheck); 

private const int MfChecked = 8;
private const int MfUnchecked = 0;

アイテムを確認するには、次のようにします。

CheckMenuItem(systemMenuHandle, SettingsSysMenuId, MfChecked);

そしてチェックを外します:

CheckMenuItem(systemMenuHandle, SettingsSysMenuId, MfUnchecked);
于 2010-11-11T00:33:42.167 に答える