如何设置另一个应用程序焦点并使其成为活动窗口

时间:2015-08-12 05:06:33

标签: c# .net winforms visual-studio-2013

我有一个winform VS 2013 C#windows应用程序。我有一个小窗口,是最顶级的'并且坐在以窗口模式运行的飞行模拟器(FSX)应用程序之上。

我想点击我的小应用程序表单上的按钮,然后让FSX应用程序再次获得焦点,这样我就可以使用我的FSX热键在飞行时在FSX内部执行操作。

当FSX正在运行时,声音已启用,因此我可以在有焦点时听到它。

当我点击我的小应用程序表单按钮时,我几乎没有听到50%的声音。因此,FSX在我的小应用程序上点击一个按钮的时间大约有一半时间,并且有一半的时间没有得到关注。

我的代码如下。有没有更好的方法,更可靠的方法来做到这一点?

        System.Diagnostics.Process[] ieProcs = Process.GetProcessesByName("fsx");
        if (ieProcs.Length > 0)
        {
            foreach (System.Diagnostics.Process p in ieProcs)
            {
                SwitchToThisWindow(p.Handle, true);
                p.Refresh();
                break;
            }
        }

1 个答案:

答案 0 :(得分:1)

  

我不会有50%的时间听到声音

简短回答 - FSX(开箱即用)不会在后台播放声音。

因此,当您的应用具有焦点时,FSX声音将会悲伤地停止。

要修复此问题,当您希望重新激活FSX时,SwitchToThisWindow()需要执行相当于向 WM_ACTIVATE 的操作。你似乎已经做了这么多,你的50%的成功率证明了这一点 - 它似乎意味着存在更深层次的问题。

  

因此,FSX在我的小应用程序上点击一个按钮的时间大约有一半时间,并且有一半的时间没有得到关注。

您可能希望延迟发送激活,在按钮点击事件期间发送它,因为您的按钮点击也涉及先前的焦点事件。考虑使用一次性计时器 STA调度程序在将来的某个时间设置FSX焦点 (可能是10 ms)之后您已完成点击事件的处理。

我之所以这样说是因为您的应用被标记为 WS_EX_TOPMOST ,这可能会导致一些糟糕的循环循环反弹

来源

相关问题