Добавление записи в меню «Значок левого верхнего угла» в WinForms? - PullRequest
5 голосов
/ 05 августа 2009

У меня есть приложение WinForms, и я хотел бы добавить пункт меню в меню, которое открывается, когда пользователь нажимает на верхний левый угол окна (значок) или нажимает ALT + ПРОБЕЛ.

Форма показывает только MainMenu и ContextMenu, но без Icon Menu или чего-то в этом роде. Есть ли простой способ изменить это в приложении WinForms?

Я говорю об этом меню и хочу добавить простую запись «О программе», чтобы люди могли проверить версию и URL из приложения. В обычном интерфейсе для этого нет подходящего места (нет главного меню).

Alt + Пробел http://img513.imageshack.us/img513/3162/altspacemenu.jpg

Ответы [ 3 ]

7 голосов
/ 05 августа 2009

Это меню добавляется в форму, когда вы устанавливаете FormBorderStyle на что угодно, кроме «None». Когда стиль границы формы изменяется, вызывается подпрограмма под названием AdjustSystemMenu. Эта процедура использует метод GetSystemMenu для получения SystemMenu? откуда-то «Где-то» - это проблема. Кажется, нигде нет объекта SystemMenu, к которому можно получить доступ.

EDIT: Только что нашел ссылку , похоже, он может делать то, что вы хотите.

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);
    }
}
3 голосов
/ 06 августа 2009

Существует набор функций Windows API, которые могут получать и управлять этим меню.

Для C # проверьте этот пример:

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

0 голосов
/ 06 августа 2009

AFAIK, нет .Net способа сделать это.

Чтобы включить это, вам нужно перейти на Windows API, и я бы посоветовал взглянуть на WinMain и WndProc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...