最大化按钮,在最大化之前触发密码提示

本文关键字:最大化 密码 提示 按钮 | 更新日期: 2023-09-27 18:12:11

简短说明:我试图创建一个弹出式密码提示,当最大化窗口按钮被点击时触发。

更长的解释:我正在开发一个GUI,它的默认尺寸对用户隐藏了敏感控件。单击最大化窗口按钮将显示这些控件,但我希望防止普通用户轻松访问。理想情况下,我希望一个简单的密码提示弹出时,最大化窗口按钮被点击,这需要一个密码之前最大化窗口的行动发生。

我试过使用一个MessageBox和一个单独的表单,但我似乎无法阻止最大化窗口的动作发生在弹出窗口出现之前。

最大化按钮,在最大化之前触发密码提示

WindowsForms上没有OnMaximize事件。幸运的是,你可以操作WndProc事件来捕获系统消息,该消息对应于最大化按钮中的单击。

试着把这段代码放在你的表单的代码后面:

编辑:更新也捕获双击在标题栏(由Reza Aghaei的回答建议)。

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);
}

只是为了完成Ismael的好答案,如果你使用这种方式,我应该提到,这种方式用户可以最大程度地使用双击标题栏,所以你应该把这种情况添加到Ismael的代码:

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;