当我点击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);
}
有什么想法吗?
答案 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项目中起作用,确保密码框始终设置在阻止输入到桌面的表单之上,我想这是你想要实现的目标。
马丁