窗体窗体始终聚焦

本文关键字:窗体 聚焦 | 更新日期: 2023-09-27 18:04:32

我知道已经有一些关于这个的线程了。我需要的是有一个窗体窗口始终集中的意义,如果我点击记事本或任何程序,它不会在其中输入任何数据,只在我的窗体文本框输入数据。

我发现这段代码在某种程度上可以解释更多

    //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时才能正常工作,vhost.exe是Visual Studio托管进程。我在设置中禁用了它,当我从VS启动时,它工作得很好,但当我在bin文件夹中运行exe时,我仍然得到奇怪的结果

编辑

这是我用我的结果制作的一个快速视频http://www.youtube.com/watch?v=1ozpHSRGnMo

新编辑

为了解决这个问题,我将我的应用程序设置为全屏模式这样用户就可以点击其他窗口而不用先关闭这个

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

窗体窗体始终聚焦

你确实不能阻止其他窗口获得焦点,但你可以在他们获得焦点的那一刻把它从他们那里拿走;)

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

只需创建一个计时器,从一开始就启用它,使滴答间隔尽可能小,并将上面的代码作为tick-event。

希望对您有所帮助

sorry for the bad english

你的代码看起来很好,应该像你想的那样工作,你可以尝试一些建议在以下URL…只是个建议,不要用

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

您不能创建可以阻止其他程序获得焦点的Windows窗体应用程序。Windows本身不允许这样做。解决这个问题的唯一方法是在全屏模式下创建OpenGLDirectX应用程序。这将阻止用户看到任何其他应用程序。但即使这样,用户也可以通过Alt+Tab返回到其他应用程序。