Как мне держать форму сверху и не дать ей потерять фокус? - PullRequest
0 голосов
/ 02 февраля 2012

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 голосов
/ 15 февраля 2012

Вы можете попробовать установить для владельца frmLogin значение frmLockScreen

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

, а затем установить событие для активированного frmLockScreen, чтобы вывести frmLogin на передний план?

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

ЭтоЯ работал над старым VB Project несколько лет назад, убедившись, что поле пароля всегда было установлено над формой, которая блокировала ввод на рабочий стол, и я думаю, это то, чего вы пытаетесь достичь.

Мартын

0 голосов
/ 02 февраля 2012

Если вы хотите создать форму, которая не теряет фокус ни на что, вам не повезло.Раймонд Чен объясняет это как проектное решение для Windows - две программы не смогут установить свои собственные окна как супер-верхние, поэтому Windows не позволяет ни одной программе попробовать.Теперь, если вы как-то модифицируете встроенный экран входа в Windows, вам может повезти, так как процесс winlogon обладает дополнительными привилегиями и может действительно переключать рабочие столы, реагировать на Ctrl-Alt-Delete и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...