最大化之前触发密码提示的最大化按钮?
Maximize button that triggers password prompt before maximizing?
简短说明:我正在尝试创建弹出式密码提示,当单击最大化-window 按钮时会触发该提示。
更长的解释:我正在开发一个 GUI,其默认尺寸对用户隐藏敏感控件。单击 Maximize-window 按钮将显示这些控件,但我想防止临时用户轻松访问。理想情况下,我希望在单击 Maximize-window 按钮时弹出一个简单的密码提示,这需要在 Maximize-window 操作发生之前输入密码。
我试过使用 MessageBox 和单独的表单,但我似乎无法阻止在弹出窗口出现之前执行 Maximize-window 操作。任何帮助将不胜感激。
WindowsForms 上没有 OnMaximize 事件。幸运的是,您可以操纵 WndProc 事件来捕获对应于单击最大化按钮的系统消息。
尝试将此代码放在表单的 code-behind 中:
编辑: 更新以在标题栏中捕获 double-click(由 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;
简短说明:我正在尝试创建弹出式密码提示,当单击最大化-window 按钮时会触发该提示。
更长的解释:我正在开发一个 GUI,其默认尺寸对用户隐藏敏感控件。单击 Maximize-window 按钮将显示这些控件,但我想防止临时用户轻松访问。理想情况下,我希望在单击 Maximize-window 按钮时弹出一个简单的密码提示,这需要在 Maximize-window 操作发生之前输入密码。
我试过使用 MessageBox 和单独的表单,但我似乎无法阻止在弹出窗口出现之前执行 Maximize-window 操作。任何帮助将不胜感激。
WindowsForms 上没有 OnMaximize 事件。幸运的是,您可以操纵 WndProc 事件来捕获对应于单击最大化按钮的系统消息。
尝试将此代码放在表单的 code-behind 中:
编辑: 更新以在标题栏中捕获 double-click(由 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;