Отключите «требование», чтобы дважды щелкнуть не сфокусированное окно при нажатии на меню - PullRequest
8 голосов
/ 17 июня 2010

Извините за странный заголовок, я в настоящее время играюсь с WinForms, и мне интересно, есть ли способ сделать это так, чтобы вам не приходилось «дважды щелкать» окно, чтобы активировать элемент вMenustrip, когда окно не сфокусировано?

В настоящее время, если окно не сфокусировано, мне сначала нужно щелкнуть окно, чтобы выделить его, а затем еще раз щелкнуть элемент меню, даже если моя мышь с самого начала зависла над элементом меню.

Заранее спасибо!

Ответы [ 2 ]

9 голосов
/ 17 июня 2010

Попробуйте добавить эту функцию в свой класс Form:

protected override void WndProc(ref Message m) {
    int WM_PARENTNOTIFY = 0x0210;
    if (!this.Focused && m.Msg == WM_PARENTNOTIFY) {
        // Make this form auto-grab the focus when menu/controls are clicked
        this.Activate();
    }
    base.WndProc(ref m);
}
0 голосов
/ 03 ноября 2017

Метод в ответе @ Detmar будет фокусировать окно при его разрушении (см. https://msdn.microsoft.com/en-us/library/windows/desktop/hh454920(v=vs.85).aspx).. Это может вызвать проблемы, если в вашем приложении несколько окон, и вы выходите. срабатывание при утилизации окон:

    protected override void WndProc(ref Message m)
    {
        const int WM_PARENTNOTIFY = 0x0210;
        if (!this.Focused && m.Msg == WM_PARENTNOTIFY)
        {
            const int WM_CREATE = 0x0001;
            const int WM_DESTROY = 0x0002;
            const int WM_LBUTTONDOWN = 0x0201;
            const int WM_MBUTTONDOWN = 0x0207;
            const int WM_RBUTTONDOWN = 0x0204;
            const int WM_XBUTTONDOWN = 0x020B;
            const int WM_POINTERDOWN = 0x0246;

            int type = (int)(0xFFFF & (long)m.WParam);
            switch (type)
            {
                case WM_LBUTTONDOWN:
                case WM_MBUTTONDOWN:
                case WM_RBUTTONDOWN:
                case WM_XBUTTONDOWN:
                case WM_POINTERDOWN:
                    // Make this form auto-grab the focus when menu/controls are clicked
                    this.Activate();
                    break;
                case WM_DESTROY:
                case WM_CREATE:
                    //do nothing
                    break;
            }
        }
        base.WndProc(ref m);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...