Окно Windows Form всегда сфокусировано?

Я знаю, что об этом уже было несколько тем. Мне нужно, чтобы окно формы Windows всегда было сфокусировано, что означает, что если я нажму на блокнот или любую другую программу, она не будет вводить в нее никаких данных, а будет вводить данные только в текстовое поле формы Windows.

Я нашел этот код, который несколько работает, объяснит больше

    //Delegates for safe multi-threading.
    delegate void DelegateGetFocus();
    private DelegateGetFocus m_getFocus;
    Thread newThread;

    public MemberLogin()
    {

        m_getFocus = new DelegateGetFocus(this.getFocus);  
        InitializeComponent();
        spawnThread(keepFocus);
        toggleFocusButton.Text = "OFF";
        timer1.Interval = 2000;
        textBox1.Select();
    }

    //test focus stuff
    //Spawns a new Thread.
    private void spawnThread(ThreadStart ts)
    {
        try
        {
            newThread = new Thread(ts);
            newThread.Start();
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message, "Exception!", MessageBoxButtons.OK,
                MessageBoxIcon.Error);
        }
    }

    //Continuously call getFocus.
    private void keepFocus()
    {
        while (true)
        {
            getFocus();
        }
    }

    //Keeps Form on top and gives focus.
    private void getFocus()
    {
        //If we need to invoke this call from another thread.
        if (this.InvokeRequired)
        {
            this.Invoke(m_getFocus, new object[] { });
        }
        //Otherwise, we're safe.
        else
        {
            //having this seemed to have kept my windows onTop at all times even when off 
           // this.TopMost = true;
            this.TopMost = true;
            this.Activate();
            this.textBox1.Select();
            this.textBox1.Focus();

        }
    }

этот код, кажется, работает хорошо, только когда мой проект открыт, что означает, что когда мой проект Visual Studio закрыт, окно находится вверху, но не имеет фокуса, что означает, что я могу печатать внутри других программ. Странная вещь, которую я обнаружил, заключается в том, что и в блокноте, и в моем текстовом поле была мигающая строка, указывающая, где вы пишете текст. Если я запускаю свое приложение из проекта Visual Studio, все работает так, как должно, и когда я пытаюсь щелкнуть другие окна, оно не дает мне доступа, чего я и хочу.

Поэтому я немного смущен тем, почему он работает правильно только с открытым проектом.

Также обратите внимание, что пока проект открыт, даже .exe и другие копии, которые я сделал, работают правильно, я закрываю решение проекта, и программа делает то, что я объяснил выше.

Только что провел еще несколько тестов, и, похоже, он работает правильно только тогда, когда этот процесс запущен vhost.exe, который является хост-процессом Visual Studio. Я отключил его в настройках, и когда я запускаю из VS, он работает нормально, но когда я запускаю только exe в папке bin, я все равно получаю странные результаты.

ИЗМЕНИТЬ

Вот небольшое видео, которое я сделал с моими результатами http://www.youtube.com/watch?v=1ozpHSRGnMo

Новое изменение

Что я сделал, чтобы исправить это, так это установил мое приложение в полноэкранном режиме, сделав это, чтобы пользователь мог щелкнуть другие окна, не закрывая это окно сначала.

this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;

person Steven    schedule 19.03.2013    source источник
comment
Windows имеет явную контрмеру, чтобы помешать вам сделать это. Программисты никогда не задумываются об очевидной ошибке: что, если это сделают две программы?   -  person Hans Passant    schedule 20.03.2013
comment
Посмотрите это видео, которое я только что сделал, показывающее результаты youtube.com/watch?v=1ozpHSRGnMo и нет, это не дубликат, поскольку я сказал, что код работает, и я получил его из другого поста на этом сайте. Но код работает только при выполнении из VS2012, то есть когда я нажимаю кнопку F5 для запуска своего приложения. Как я не могу даже нажать на другие окна, это то, что я хочу! Но затем я запускаю exe и могу писать в других окнах, например в блокноте. Итак, я думаю, что VS2012 каким-то образом дает моему приложению больший приоритет над другими.   -  person Steven    schedule 20.03.2013


Ответы (3)


Вы не можете создать приложение Windows Forms, которое может помешать другим программам получить фокус. Сама Windows этого не допустит. Единственный способ обойти это — создать приложение OpenGL или DirectX в полноэкранном режиме. Это не позволит пользователю видеть любое другое приложение. Но даже при этом пользователь может Alt+Tab вернуться к другим приложениям.

person rhughes    schedule 20.03.2013
comment
Да, я думаю, что вы правы насчет этого. Что я сделал, чтобы решить эту проблему, так это то, что я сохранил свой новый поток, следя за тем, чтобы он был самым верхним все время, и я установил для стиля границы значение none и развернул окно, так что это похоже на полноэкранный режим, который устраняет все проблемы, спасибо, также я должен добавить, что вкладка alt не не работаю с этим так идеально, спасибо еще раз - person Steven; 20.03.2013

Это правда, что вы не можете предотвратить получение фокуса другими окнами, но вы можете забрать его у них, как только они его получат;)

private void timer1_Tick(object sender, EventArgs e)
{
    if (!this.Focused)
    {
        this.Activate();
    }
}

просто создайте таймер, включите его с самого начала, сделайте интервал тиков настолько маленьким, насколько хотите, и поместите код выше как тик-событие.

надеюсь это поможет

извините за плохой английский

person ChronosMOT    schedule 07.04.2013
comment
Оооо, как восхитительно зло! - person carefulnow1; 22.06.2016

ваш код выглядит нормально и должен работать так, как вы хотите, можете ли вы попробовать что-то, что предлагается в следующем URL-адресе... просто предложение, вместо того, чтобы использовать

this.TopMost = true;

http://www.c-sharpcorner.com/uploadfile/kirtan007/make-form-stay-always-on-top-of-every-window/

person Jhigs    schedule 19.03.2013
comment
На самом деле это сработало, но все еще не решило мою проблему с фокусировкой. Я все еще могу писать в блокноте или любом другом программном обеспечении, которое я установил, ведь я стараюсь этого избегать. Поэтому, когда никого нет за ПК и кто-то пытается войти в систему, он не будет печатать в неправильном окне, поэтому я хочу, чтобы мой экран входа в систему всегда был сфокусирован с помощью кнопки. Это работает только тогда, когда я запускаю проект из VS2012, но когда я запускаю exe, он не работает должным образом. - person Steven; 20.03.2013