Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何保持我的状态在顶部,防止它失去焦点?_C#_.net_Winforms - Fatal编程技术网

C# 我如何保持我的状态在顶部,防止它失去焦点?

C# 我如何保持我的状态在顶部,防止它失去焦点?,c#,.net,winforms,C#,.net,Winforms,如果我想在单击frmLockScreen中的任意位置时使frmLogin不失去焦点 这两种形式是usetopmost=true和call-formfrmainclient showDialog对我来说不是一个很好的答案,因为它会阻止其他线程,但我不需要失去焦点 我会解释原因 我正在用它来建立我的网吧程序 这就是服务器所称的 public void LockScreen() { var client = CurrentClient;

如果我想在单击
frmLockScreen
中的任意位置时使
frmLogin
不失去焦点

这两种形式是use
topmost=true
和call-form
frmainclient

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

我会解释原因

我正在用它来建立我的网吧程序

这就是服务器所称的

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

有什么想法吗?

如果你想创建一个无论如何都不会失去焦点的表单,那你就太倒霉了。Raymond Chen作为Windows设计决策-两个程序不可能将自己的Windows设置为超级顶级,因此Windows也不允许一个程序尝试。现在,如果您以某种方式修改内置的Windows登录屏幕,您可能会更幸运,因为winlogon进程具有额外的权限,确实可以切换桌面、响应Ctrl-Alt-Delete等。

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

frmLogin.Show(this);
frmLogin.BringToFront();
然后设置激活的frmLockScreen事件,将frmLogin带到前面

private void frmLockScreen_Activated(object sender, EventArgs e)
{
  frmLogin.BringToFront();
  frmLogin.Focus();    
}
这在几年前的一个旧VB项目中对我有效,确保密码框始终设置在阻止输入到桌面的表单上方,我猜这就是您试图实现的目标


Martyn

此问题的正确解决方案是使用
ShowDialog
方法将表单显示为模式对话框。那么,什么线程是
ShowDialog
阻塞?您在哪里/为什么创建这些线程?什么是
frmLockScreen
?你的应用程序到底在做什么?你的问题描述了一个通过模态解决的问题……但是你没有用WinForms来解决这个问题。