0

简短说明:我正在尝试创建一个弹出密码提示,当单击最大化窗口按钮时会触发该提示。

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

我尝试过使用 MessageBox 和单独的表单,但我似乎无法阻止在弹出窗口出现之前发生 Maximize-window 操作。任何帮助将不胜感激。

4

2 回答 2

3

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);
}
于 2015-09-09T18:25:30.150 回答
1

只是为了完成伊斯梅尔的好答案,如果你使用这种方式,我应该提到这种方式用户可以通过双击标题栏来最大化,所以你应该将此案例添加到伊斯梅尔的代码中:

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;
于 2015-09-09T19:05:09.383 回答