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

本文关键字:焦点 窗口 活动 应用程序 何设置 设置 另一个 | 更新日期: 2023-09-27 18:07:21

我有一个winform VS 2013 c# windows应用程序。我有一个小窗口,是"Top Most",坐在飞行模拟器(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;
            }
        }

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

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

简短的回答- FSX(开箱即用)播放声音时,它是在后台。

所以当你的应用有焦点时,FSX声音会可悲地停止。

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

所以,FSX有一半的时间得到焦点,我点击一个小应用程序的按钮,一半的时间它没有得到焦点。

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

我这么说的原因是你的应用程序被标记为WS_EX_TOPMOST这可能会导致一些古怪的循环反弹

来源
  • http://www.avsim.com/topic/421600-window-focus-and-sound/
  • http://steamcommunity.com/app/314160/discussions/1/620712999984244237/