【问题标题】:Windows Form Window Always Focused?Windows 窗体窗口始终聚焦?
【发布时间】:2013-03-19 07:28:52
【问题描述】:

我知道已经有一些关于此的主题。如果我单击记事本或任何程序,它不会在其中输入任何数据,而只会在我的 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 时才能正常工作,vhost.exe 是 Visual Studio 托管进程。我在设置中禁用了它,当我从 VS 启动时它工作正常,但是当我只运行 bin 文件夹中的 exe 时,我仍然得到奇怪的结果

编辑

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

新编辑

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

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

【问题讨论】:

  • Windows 有明确的对策来阻止您这样做。程序员从不考虑明显的故障模式:如果 两个 程序会这样做呢?
  • 查看我刚刚制作的显示结果的视频youtube.com/watch?v=1ozpHSRGnMo,不,它不是重复的,因为我说代码有效,我从本网站的另一篇文章中得到它。但是该代码仅在从 VS2012 执行时才有效,这意味着当我按下 F5 按钮运行我的应用程序时。就像我什至不能点击其他窗口一样,这就是我想要的!但是然后我运行exe,我可以在记事本等其他windows中编写。所以我的想法是 VS2012 以某种方式让我的应用程序比其他应用程序更优先。

标签: c# .net winforms window form-control


【解决方案1】:

确实,您无法阻止其他窗口获得焦点,但您可以在它们获得焦点的第二秒将其从它们那里拿走;)

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

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

希望对你有帮助

对不起英语不好

【讨论】:

  • 哦,多么邪恶的美味!
【解决方案2】:

您的代码看起来不错,应该可以按照您的意愿工作,您可以尝试以下 URL 中建议的内容...不过只是一个建议,而不是使用

this.TopMost = true;

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

【讨论】:

  • 实际上这有效,但仍然没有解决我的焦点问题。我仍然可以在记事本或我安装的任何其他软件中书写,这是我试图避免的。因此,当没有人在 PC 上并且有人尝试登录时,他们不会在错误的窗口中输入,所以我希望我的登录屏幕始终在一个按钮的帮助下聚焦。这仅在我从 VS2012 运行项目时才有效,但是当我运行 exe 时它不能正常工作。
【解决方案3】:

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

【讨论】:

  • 是的,我认为你是对的。我为解决这个问题所做的是我保持我的新线程确保它一直处于最上面,我将borderstyle设置为none并将窗口最大化,所以就像让它全屏修复所有问题一样,谢谢我还应该添加alt选项卡没有'再次感谢这个完美的作品
猜你喜欢
  • 2011-06-05
  • 2016-11-17
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多