【问题标题】:Ask for a password before restoring a minimized window在恢复最小化窗口之前询问密码
【发布时间】:2012-01-24 17:05:19
【问题描述】:

我正在寻找如何在最小化窗口恢复之前询问密码。

实际上,当我恢复窗口时,主窗体在显示密码对话框之前是可见的。 (我使用“Resize”事件在表单恢复时调用我的密码对话框。)

但我需要在主窗体可见之前显示密码对话框(因为它包含未经授权的人无法看到的敏感数据)

在验证密码之前使主窗体不可见的任何想法。

谢谢

【问题讨论】:

  • 在任何 vista 或 7 机器上,很容易绕过您的安全系统。只需将鼠标悬停在任务栏中的窗口上即可。我建议寻找不同的方法。 (也许您可以在正确输入密码之前隐藏表单的内容?)
  • 我同意,但由于缩略图很小,内容不可读,所以对我来说不是问题。
  • Ctrl+Win+Tab 的事情呢。它有非常大的预览。
  • 这个我忘了,不过没问题,我会用windowsAPIcodePack替换缩略图(允许自定义win+tab缩略图和任务栏预览)
  • windowsAPICodePack 绝对不是一个解决方案(由于公司的指导方针,如果我想使用外部应用程序,它必须由我们的标准部门验证(并且需要一个月)。所以如果有人有另一个解决方案. 隐藏控件/mdi 或添加面板不起作用。Windows 7 似乎在重新设置表单之前截取了屏幕截图。

标签: c# .net winforms


【解决方案1】:

您可以处理表单的Resize 事件,并在最小化时使所有控件不可见。

然后,依次处理要恢复的表单的Resize 事件,要求输入密码并使所有控件再次可见。

例如:

private void MyForm_Resize(object sender, EventArgs e)
{
    if ( WindowState == FormWindowState.Minimized )
    {
        // Hide controls.
    }
    else if ( WindowState == FormWindowState.Normal )
    {
        // Ask for password, then show controls.
    }
}

为了简化控件的显示/隐藏,只需使用Panel 控件作为表单的唯一直接子级,将所有控件放在此面板内并使其可见/不可见:

(图中绿色代表Panel控件)

【讨论】:

  • 我不能用这个,因为我的主窗体太复杂了。它包含一个标题(带有敏感数据)和一个带有多个子窗体的 MDI 容器。
  • 如果它是 MDI 容器,您的主窗体可以隐藏它的 MDI 子窗体。然后登录后,恢复窗口位置。
【解决方案2】:

这听起来像是一种解决方法。为什么不创建一个覆盖面板或使用窗口内容的可见性?然后,您可以完全控制人们可以看到的内容。

如前所述,应用预览(以及 alt+tab、windows+tab 等)也会显示内容。

【讨论】:

  • 使用 windowsAPIcodePack 您可以重新生成生成的缩略图。
  • 那么它仍然是一种解决方法。您只是“假设”没有其他方法可以看到窗口。 (但是,如果您接受这种方式或安全性就足够了,这没问题。在您的示例中;点击应用程序时人们的可见性)。
  • 经过更多的测试和反思,这是最确定的解决方案
  • @Webmixer 我不介意您是否认为我的答案是最佳解决方案。但是,我们不希望对接受的标志进行太多更改。
【解决方案3】:

您可以将表单的Visible-Property 设置为false,直到输入密码,这样表单才真正可见,但我同意 Aphelion 的观点,覆盖可能是更好的选择...

【讨论】:

  • 此解决方案有效。如果我在用户最小化主表单时将表单可见设置为 false 并将密码对话框设置为 true,则 Windows 7 仅将密码请求显示为预览。谢谢
【解决方案4】:

更安全/更可靠的方法是在您最小化时简单地将应用程序的内容涂黑。

给你创建一个文本框输入密码的覆盖,你是金子。

【讨论】:

    【解决方案5】:

    所有建议的解决方案均无效: 似乎 Win7 在 resize 事件发生之前截取了您的应用程序的屏幕截图,因此即使您添加了面板(或者如果您尝试隐藏某些控件),主窗体仍然在缩略图中可见。

    我找到的解决方案:点击最小化按钮并在主窗体上显示一个面板 -> 这发生在调整大小事件之前,Windows 7 将此图片作为缩略图。

    和代码示例:

        private const int WM_SYSCOMMAND = 0x0112; 
        private const int SC_MINIMIZE = 0xf020;
        protected override void WndProc(ref Message m) 
        { 
            if (m.Msg == WM_SYSCOMMAND) 
            { 
                if (m.WParam.ToInt32() == SC_MINIMIZE) 
                { 
                    m.Result = IntPtr.Zero; 
                    panel1.Height = this.Height; // cover the whole form
                    panel1.Width = this.Width;
                    panel1.Visible = true; // make it visible
                }
            } 
            base.WndProc(ref m); 
        } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多