2009-08-05 12 views
3

私はWinFormsアプリケーションを持っていて、ユーザーがウィンドウの左上隅(アイコン)をクリックするか、またはAlt + Spaceを押すと開くメニューにメニュー項目を追加したいと思います。WinFormsの左上隅のアイコンメニューに項目を追加しますか?

フォームにはMainMenuとContextMenuが表示されますが、Icon Menuなどは表示されません。 WinFormsアプリケーションでこれを変更する簡単な方法はありますか?

私はこのメニューについて話しています。アプリケーション内からバージョンとURLを確認するための単純な「About」エントリを追加したいと思います。このために通常のUIには良い場所はありません(メインメニューなし)。

Alt+Space Menu http://img513.imageshack.us/img513/3162/altspacemenu.jpg

+0

を見てお勧めしますこれを行う有効にするには

答え。 –

+0

私は今見つけられませんでしたが、私は1つを探していました。 Chromeを使用したくないのですが、変更されたUI –

+0

[Windowsフォームのシステムメニューをカスタマイズするにはどうすればいいですか?](http://stackoverflow.com/questions/4615940/how-can-i-customize-the -system-of-a-windows-form) –

答えて

4

あなたが「なし」以外のものにFormBorderStyleを設定した場合、このメニューは、フォームに追加されます。フォーム境界線スタイルが変更されると、AdjustSystemMenuというルーチンが呼び出されます。このルーチンは、GetSystemMenuメソッドを使用してSystemMenuを取得しますか?どこかから。 「どこか」が問題です。アクセス可能なSystemMenuオブジェクトはどこにもありません。

編集: これはちょうどこれを見つけた、それはあなたが欲しいかもしれないようです。

public partial class Form1 : Form 
{ 
    #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 
    public const Int32 WM_SYSCOMMAND = 0x112; 
    public const Int32 MF_SEPARATOR = 0x800; 
    public const Int32 MF_BYPOSITION = 0x400; 
    public const Int32 MF_STRING = 0x0; 

    #endregion 

    // The constants we'll use to identify our custom system menu items 
    public const Int32 _SettingsSysMenuID = 1000; 
    public const Int32 _AboutSysMenuID = 1001; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     /// Get the Handle for the Forms System Menu 
     IntPtr systemMenuHandle = GetSystemMenu(this.Handle, false); 

     /// Create our new System Menu items just before the Close menu item 
     InsertMenu(systemMenuHandle, 5, MF_BYPOSITION | MF_SEPARATOR, 0, string.Empty); // <-- Add a menu seperator 
     InsertMenu(systemMenuHandle, 6, MF_BYPOSITION, _SettingsSysMenuID, "Settings..."); 
     InsertMenu(systemMenuHandle, 7, MF_BYPOSITION, _AboutSysMenuID, "About..."); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     // Check if a System Command has been executed 
     if (m.Msg == WM_SYSCOMMAND) 
     { 
      // Execute the appropriate code for the System Menu item that was clicked 
      switch (m.WParam.ToInt32()) 
      { 
       case _SettingsSysMenuID: 
        MessageBox.Show("\"Settings\" was clicked"); 
        break; 
       case _AboutSysMenuID: 
        MessageBox.Show("\"About\" was clicked"); 
        break; 
      } 
     } 

     base.WndProc(ref m); 
    } 
} 
+0

ありがとう、GetSystemMenuは、私はそれが何が呼び出されたのか分からなかったので、私が見つけることができなかったビットです。 –

3

このメニューを取得して操作できるWindows API関数があります。この例を確認するC#の場合

http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c9327

+0

ありがとう!その記事は役に立ちます。私はStewbobの記事を受け入れています。なぜなら、関数をリストしているからです(GetSystemMenuを使って同じ記事を同時に見つけました:)) –

0

は、私の知る限り、これを行うにはネットの方法はありません。あなたは、WindowsのAPIにドロップする必要があるだろうと私はあなたがより良い点を説明して案内するように変更システムメニューの画像を貼り付けているはずのWinMainとのWndProc

関連する問題