Панель задач Минимизировать проблему формы Windows C # - PullRequest
1 голос
/ 28 апреля 2011

У меня есть приложение Windows Form, которое, когда форма активирована, деактивирована или SizeChanged, форма что-то делает. Это довольно специфично. Например:

Форма активирована : установит для переменной isActive значение true и сфокусирует ввод в поле ввода, чтобы кто-то тоже мог что-то ввести.

Форма деактивирована : установит для переменной isActive значение false, чтобы любые изменения фокуса в приложении (вызванные сообщениями удаленного компьютера, сообщениями чата и т. Д.) Не захватывали фокус из других приложений .

Прямо сейчас у меня есть команда webBrowser1.Focus() внутри события Form Activated, которая не идеальна, например, когда вы нажимаете на значок на панели задач, она пытается свести к минимуму, но, поскольку она фокусируется обратно на веб-браузере, Затем форма восстанавливается / активируется снова.

Я провел здесь поиск по переполнению стека и нашел следующую информацию:

Отредактировано для приведенной ниже информации:

Я нашел эту информацию в другом посте здесь о переполнении стека:

protected void OnActivateApp(bool activate)
{
    Console.WriteLine("Activate {0}", activate);
}

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    // Trap WM_ACTIVATEAPP
    if (m.Msg == 0x1c) OnActivateApp(m.WParam != IntPtr.Zero);
    base.WndProc(ref m);
}

Но поведение похоже на проблему, с которой я сталкиваюсь в вышеупомянутых 2 событиях. Когда значок на панели задач щелкается, форма ловит Деактивировано:

Активировать Ложь

Но сразу же, он делает это:

Активировать True

Может показаться, что при сворачивании окна с помощью кнопки панели задач оно остается «сфокусированным» приложением до тех пор, пока вы не нажмете другое приложение.

В одном из постов было предложено захватить GotFocus формы, но я не могу найти событие для уровня формы для GotFocus, поскольку GotFocus получено из элемента управления, а не из приложения форма.

Вопрос: Как разрешить сворачивание формы с помощью кнопки на панели задач, и когда форма будет повторно отображена, заставить ее выполнить команду webBrowser1.Focus(), чтобы поместить фокус в нужное место

Ответы [ 3 ]

2 голосов
/ 16 июля 2015

Вот как я решил проблему. Ранее я вызывал Focus () для ActiveElement в OnActivation. Однако, в дополнение к вызову минимизации на панели задач, который вы заметили, нажатие Alt-tab для выделения фокуса формы также не вызывает вызов OnActivation.

В результате я решил посмотреть на сообщение WM_ACTIVATE, чтобы определить, когда следует сфокусироваться. Из документов MSDN :

WPARAM

Слово младшего разряда указывает, активируется ли окно или деактивируется. Этот параметр может принимать одно из следующих значений. старшее слово определяет минимизированное состояние окна активирован или деактивирован. Ненулевое значение указывает, что окно сведено к минимуму.

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message message)
{
    base.WndProc(ref message);
    if (message.Msg == 0x6)
    {
        int highOrderWord = (int)((message.WParam.ToInt32() & 0xFFFF0000) >> 16);
        bool minimized = highOrderWord != 0;
        bool activating = message.WParam != IntPtr.Zero;
        if (activating && !minimized)
        {
            this.FocusBrowserElement();
        }
    }
}


private void FocusBrowserElement()
{
    if (!this.webBrowser.IsDisposed && 
         this.webBrowser.Document != null &&
         this.webBrowser.Document.ActiveElement != null)
    {
        this.webBrowser.Document.ActiveElement.Focus();
    }
}
0 голосов
/ 28 апреля 2011

Извините, я думал, что событие GotFocus будет работать против формы, но, похоже, оно не сработает, когда фокус на самом окне меняется.

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

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private bool isActive = false;
    private FormWindowState previousstate;
    private void Form1_Load(object sender, EventArgs e)
    {
        previousstate = this.WindowState;
        //Got Focus Anonymous Delegate handles focus on the textbox
        //if the Form currently is Activated
        this.Resize += delegate(object resizesender, EventArgs resizee)
        {
            //if (previousstate == FormWindowState.Minimized)
            // {
                txtGetFocus.Focus();
                this.Refresh();
            // }
            previousstate = this.WindowState;
        };
        this.Activated += delegate(object activatedsender, EventArgs activatede)
        {
            isActive = true;
        };
        this.Deactivate += delegate(object deactivatesender, EventArgs deactivatee)
        {
            isActive = false;
        };
    }
}

Я прокомментировал тестовый случай, если вы хотите подавить движение на основе определенного состояния Windows. Надеюсь, это поможет.

0 голосов
/ 28 апреля 2011

Мне не нравится ваш подход к фокусам, и это жестокий взлом, но вы можете отложить изменение фокуса на одну секунду, например:

Thread t = new Thread((ThreadStart)delegate(){
  Thread.Sleep(1000);
  this.Invoke(methodChangingFocus, new object[] {});
}).Start();

Это может дать пользователю возможность нажать кнопку сворачивания.

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