如何保持表格顶部并防止其失去焦点?

时间:2012-02-02 06:11:28

标签: c# .net winforms

enter image description here

当我点击frmLogin中的任意位置时,如果我想frmLockScreen而不失焦点。

这两个表单是使用topmost = true和调用表单frmMainClient

showDialog对我来说不是一个好的答案,因为它阻止了另一个线程,但我不需要失去焦点。

我会解释原因。

我正在使用SCS Framework来构建我的网吧计划

这就是服务器所谓的

public void LockScreen()
        {
            var client = CurrentClient;
            client.ClientProxy.LockScreen();
        }

这是客户提供给服务器的

 public void LockScreen()
        {
            _main.clearAndLockScreen();
        }

如果我使用showDialog,那么在运行时它会停留在ShowDialog()行,并且无法将响应消息发送回服务器,因为它没有完成此功能。然后,服务器将捕获在超时到达后没有客户端响应的异常。

 public void clearAndLockScreen()
    {
        startTimeTextBox.InvokeIfRequired(s => { s.ResetText(); });
        costTextBox.InvokeIfRequired(s => { s.ResetText(); });
        memberIdLabel.InvokeIfRequired(s=>{ s.ResetText();});
        _currentElapsedTimeDisplay.InvokeIfRequired(s => 
        {
            timerManager.reset();
            s.ResetText(); 
        });
        expDateTB.InvokeIfRequired(s => { s.ResetText(); });
        remainTB.InvokeIfRequired(s => { s.ResetText(); });

        lockScreen.InvokeIfRequired(s =>
        {
            lockScreen = new LockScreen(this);
            lockScreen.Show();
        });    

        loginForm.InvokeIfRequired(s =>
        {
            loginForm = new LoginForm(this);
            loginForm.ShowDialog();
        });
        process.MoveNext(Command.Logout);
    }

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您想创建一个不会失去焦点的表单,那么您就不走运了。 Raymond Chen explains this作为Windows设计决定 - 两个程序不可能将自己的窗口设置为超级最顶层,因此Windows不会让一个程序尝试。现在,如果您以某种方式修改内置Windows登录屏幕,您可能会有更多的运气,因为winlogon进程具有额外的权限,并且确实可以切换桌面,响应Ctrl-Alt-Delete等。

答案 1 :(得分:0)

您可以尝试将frmLogin的所有者设置为frmLockScreen

frmLogin.Show(this);
frmLogin.BringToFront();

然后设置frmLockScreen激活的事件以将frmLogin带到前面?

private void frmLockScreen_Activated(object sender, EventArgs e)
{
  frmLogin.BringToFront();
  frmLogin.Focus();    
}

这对几年前我在一个旧的VB项目中起作用,确保密码框始终设置在阻止输入到桌面的表单之上,我想这是你想要实现的目标。

马丁