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