Принудительно сфокусируйте окно в C#, а не просто заставьте его мигать оранжевым цветом на панели задач

#c# #windows #winforms

Вопрос:

Я использовал следующее крысиное гнездо кода, чтобы попытаться сохранить окно моей программы киоска вверху и текстовое поле внутри него выбранным:

         // Keeps the form on top and the text box selected
        private void SecurityTimer_Tick(object sender, EventArgs e)
        {
            uint foreThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
            uint appThread = GetCurrentThreadId();
            const uint SW_SHOW = 5;
            if (foreThread != appThread)
            {
                AttachThreadInput(foreThread, appThread, true);
                BringWindowToTop(this.Handle);
                ShowWindow(this.Handle, SW_SHOW);
                AttachThreadInput(foreThread, appThread, false);
            }
            else
            {
                BringWindowToTop(this.Handle);
                ShowWindow(this.Handle, SW_SHOW);
            }
            this.TopMost = false;
            this.TopMost = true;
            this.Activate();
            CardTextBox.Focus();
        }
 

Когда я запускаю его с помощью кнопки «Начать отладку» в Visual Studio, код работает должным образом и сохраняет окно вверху, не позволяя отображать меню «Пуск» и переключатель задач Win Tab. Однако, когда я напрямую запускаю скомпилированный файл .exe из проводника, это не останавливает открытие других программ и только заставляет программу мигать оранжевым цветом на панели задач. Я тоже пытался this.Activate() и this.Focus() , но они тоже не сработали. Я нахожусь в Windows 10. Может кто-нибудь, пожалуйста, рассказать мне о проблеме с моим кодом? Спасибо!

Комментарии:

1. делает ли он это также, когда вы запускаете его от имени администратора?

2. @FranzGleichmann К сожалению, да! Единственный способ заставить его работать по назначению-запустить его из интегрированной среды разработки, а не из проводника.