2013-03-19 168 views
0

我知道这里已经有几条线了。我需要的是有一个窗口窗口始终集中意味着如果我点击记事本或任何程序,它不会输入任何数据,只在我的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和其他copys妥善我关闭该项目解决方案与项目,为什么它只能正确打开

而且只要注意有点混乱该程序做了我上面解释的。

只做了一些更多的测试,并且它似乎只在该进程运行vhost.exe(这是Visual Studio托管进程)时才能正常工作。我禁用它的设置,当我从VS它工作正常开展,但是当我在bin文件夹只运行exe文件我仍然得到奇怪的结果

编辑

这里有一个快速的视频我做了我的结果http://www.youtube.com/watch?v=1ozpHSRGnMo

新的编辑

我没有解决这个问题是什么做这个设置我在全屏模式下的应用程序还挺这样用户可以去点击其它窗口不关闭这一个第一

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

Windows有一个明确的应对措施到位,从这样阻止你。程序员从不考虑明显的失败模式:如果*两个*程序会这样做会怎么样? – 2013-03-19 23:23:26

+0

[保持应用程序在顶部和焦点 - 始终]可能的重复(http://stackoverflow.com/questions/2444842/keeping-an-application-on-top-and-in-focus-always) – 2013-03-20 04:57:58

+0

退房我刚刚制作的这段视频展示了http://www.youtube.com/watch?v=1ozpHSRGnMo的结果,并且不是重复的,因为我声明了代码的工作原理,并且我从本网站的另一篇文章中获得了它。但是代码只有在从VS2012执行时才有效,这意味着当我按F5按钮来运行我的应用程序时。就像我甚至不能点击其他窗口一样,这就是我想要的!但后来我运行这个exe文件,我可以在其他windwows(如记事本)中编写代码。所以我在想什么VS2012给我的应用程序更多优先于其他人。 – Steven 2013-03-20 06:44:48

回答

0

您无法创建可阻止其他程序获得焦点的Windows Forms应用程序。 Windows本身不会允许这样做。唯一的解决方法是在全屏模式下创建一个OpenGLDirectX应用程序。这会阻止用户看到任何其他应用程序。但即使如此,用户可以将其返回到其他应用程序。

+0

是的,我认为你是对的。我做了什么来解决这个问题是我保持我的新线程,确保它始终是最顶级的,我将边框设置为none,并最大化窗口,这就像它拥有全屏巫婆修复所有问题,也要感谢我应该添加alt选项卡, t再次与这个完美的感谢工作 – Steven 2013-03-20 08:23:35

0

你的代码似乎罚款,并应随你便工作,你可以尝试的东西,建议在以下网址...只是一个建议,虽然,而不是使用

this.TopMost = true; 

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

+0

其实这个工作,但仍然没有解决我的焦点问题。我仍然可以用记事本或任何其他我已安装的软件来编写女巫,这正是我想要避免的。所以当没有人在PC上,有人试图登录时,他们不会在错误的窗口中输入内容,所以我希望我的登录屏幕随时可以在按钮的帮助下进行关注。这只有当我从VS2012运行该项目时才起作用,但是当我运行该exe时,它不能正常工作。 – Steven 2013-03-20 06:02:21

3

这是真的,你不能阻止其他窗口获取焦点,但你可以把它从他们所获得它的第二;)

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

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

希望这有助于

SRY的英语不好

+0

Oooh,多么美味的邪恶! – carefulnow1 2016-06-22 05:04:53