Развернуть кнопку, которая запускает запрос пароля перед развертыванием?

Краткое пояснение: я пытаюсь создать всплывающее окно с запросом пароля, которое запускается при нажатии кнопки «Развернуть окно».

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

Я пытался использовать MessageBox и отдельную форму, но я не могу предотвратить действие «Развернуть окно» до появления всплывающего окна. Любая помощь будет принята с благодарностью.


person blockheadjr    schedule 09.09.2015    source источник
comment
Установите для чувствительного элемента управления значение Visible = false.   -  person LarsTech    schedule 09.09.2015
comment
Я бы посоветовал вам переосмыслить способ скрытия этих чувствительных элементов управления. Вы можете разместить их на скрытой вкладке, в другом окне или под другими панелями, чтобы они не отображались до тех пор, пока не будет обработана какая-либо подсказка пароля. Может быть, вы могли бы просто иметь кнопку на форме для входа в систему, и при нажатии на нее вы показываете свое приглашение. Затем вы можете показать свои элементы управления (предложение LarsTech работает и здесь, установив для их видимости значение false до тех пор, пока не произойдет вход в систему). Но полагаться на размеры окна — плохая идея.   -  person K_Ram    schedule 09.09.2015
comment
Пожалуйста, не полагайтесь на размеры окна, чтобы предотвратить использование чувствительных элементов управления. Было бы лучше скрыть их или вообще не создавать до тех пор, пока авторизация не будет проверена. Кроме того, лучше контролировать то, что пользователь может делать внутри, поэтому, даже если кнопки случайно становятся доступными для неавторизованного пользователя, они не вызывают плохих вещей, если этот пользователь нажимает на них.   -  person zstewart    schedule 09.09.2015
comment
Я согласен со всеми здесь, хотя я предложил решение по своему ответу, я также посоветовал бы вам скрыть элементы управления.   -  person Ismael    schedule 09.09.2015


Ответы (2)


В WindowsForms нет события OnMaximize. К счастью, вы можете манипулировать событием WndProc, чтобы перехватывать системное сообщение, соответствующее щелчку кнопки развертывания.

Попробуйте поместить этот код в код программной части вашей формы:

РЕДАКТИРОВАТЬ: обновить, чтобы также ловить двойной щелчок в строке заголовка (предложено ответом Резы Агай).

protected override void WndProc(ref Message m)
{
    // 0x112: A click on one of the window buttons.
    // 0xF030: The button is the maximize button.
    // 0x00A3: The user double-clicked the title bar.
    if ((m.Msg == 0x0112 && m.WParam == new IntPtr(0xF030)) || (m.Msg == 0x00A3 && this.WindowState != FormWindowState.Maximized))
    {
        // Change this code to manipulate your password check.
        // If the authentication fails, return: it will cancel the Maximize operation.
        if (MessageBox.Show("Maximize?", "Alert", MessageBoxButtons.YesNo) == DialogResult.No)
        {
            // You can do stuff to tell the user about the failed authentication before returning
            return;
        }
    }

    // If any other operation is made, or the authentication succeeds, let it complete normally.
    base.WndProc(ref m);
}
person Ismael    schedule 09.09.2015
comment
Зная, что события OnMaximize не существует, я, вероятно, по умолчанию выберу другой подход. Спасибо за отзыв! - person blockheadjr; 10.09.2015

Просто чтобы завершить хороший ответ Исмаэля, если вы используете этот способ, я должен упомянуть, что таким образом пользователь может максимизировать использование двойного щелчка по строке заголовка, поэтому вы должны добавить этот случай в код Исмаэля:

case 0x00A3:
    // Change this code to manipulate your password check.
    // If the authentication fails, return: it will cancel the Maximize operation.
    if (MessageBox.Show("Maximize?", "Alert", MessageBoxButtons.YesNo) == DialogResult.No)
    {
        // You can do stuff to tell the user about the failed authentication before returning
        return;
    }
    break;
person Reza Aghaei    schedule 09.09.2015