我有一个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;
}
}
答案 0 :(得分:1)
我不会有50%的时间听到声音
简短回答 - FSX(开箱即用)不会在后台播放声音。
因此,当您的应用具有焦点时,FSX声音将会悲伤地停止。
要修复此问题,当您希望重新激活FSX时,SwitchToThisWindow()
需要执行相当于向
因此,FSX在我的小应用程序上点击一个按钮的时间大约有一半时间,并且有一半的时间没有得到关注。
您可能希望延迟发送激活,不在按钮点击事件期间发送它,因为您的按钮点击也涉及先前的焦点事件。考虑使用一次性计时器或 STA调度程序在将来的某个时间设置FSX焦点 (可能是10 ms)之后您已完成点击事件的处理。
我之所以这样说是因为您的应用被标记为 WS_EX_TOPMOST ,这可能会导致一些糟糕的循环循环或反弹。