关于我第一次创作的背景。这是一个基于C#的启动程序,它允许在主要家庭影院媒体播放器(在我的情况下,Plex,MediaPortal和Kodi)之间轻松切换,这样它们都可以用于各自的优点(Plex用于下载内容,MediaPortal用于电视录音和电视直播,科代所有其他,通常是流媒体)。
这些应用程序使用pssuspend暂停,这意味着它们可以全部保持打开状态,这对于慢速计算机来说非常适用。VisualStudio窗口切换所需的调试
用户按一个按钮(在他们的遥控器上)切换回启动器来选择另一个应用程序。
我差不多在一个可用的版本,但我有一个问题,我已经缩小了一段时间。
如果我的启动程序切换到应用程序(使用下面提到的方法),我不能切换回我的启动程序进程。
- VisualStudio中没有调试或 “Visual Studio中宿主进程”(进程的vshost版)是不运行:
这仅时发生。
- 键盘/远程输入已经被应用到应用程序切换到
- 即:如果我下移到应用程序随时随地切换到我可以回去发射正常,但只要我还有内按什么我无法切换的应用程序。
- 切换出切换到的应用程序,而不是从启动器进入它。
在所有其他时间,一切都按预期工作。
要切换,我目前使用SwitchToThisWindow(IntPtr hWnd, bool fAltTab)
(从http://www.pinvoke.net/default.aspx/user32/SwitchToThisWindow.html)。我也使用Microsoft.VisualBasic.Interaction.AppActivate
(来自http://msdn.microsoft.com/en-us/library/x9784w8e(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1)。
这两者都有相同的结果。
事情我已经证实是不相关的问题:
- pssuspend:如果我没有切换回到启动前暂停运行应用程序,同样的事情发生
- 操作系统和计算机:我在3台计算机上发生相同的问题,我的Windows 8安装和两个Windows 7安装
- 监听器返回到主屏幕:这是使用来自EventGhost的UDP广播并执行其他所有需要完成的操作,例如更新在发射器上的接口,只是不切换到发射器
- 在本地机器上编译:我最初认为这有帮助,但仅仅是因为上述情况。只要该vshost进程处于打开状态,我的Windows 8计算机上编译的版本就可以在Windows 7上正常工作。我还没有尝试过任何其他系统。
- 以管理员身份运行并没有产生效果
的东西,不应该是一个问题,但为了以防万一,应注意的是,发射器的前端是全部采用CefSharp(CEF是Chrome浏览器的集成版本)。 虽然在添加之前发生了问题。
自己的潜力的想法:
- 由于在
AppActivate
提到的事,我才意识到的UIPermission水平可能无所谓,但是手动将其设置为完全信任不作任何改变。
我也意识到在VisualStudio中,“安全性”的属性设置为使用“OneClick安全性”设置,并且位于“这是一个完全信任的应用程序”选项。 这对我来说是有道理的,因为调试器会给它提供这些提升的权限,但大概这应该在没有调试运行的情况下工作。
的我的应用程序切换上下文中的某些代码:
[DllImport("user32.dll", SetLastError = true)]
static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
static Process currentProcess = Process.GetCurrentProcess();
public static void SwitchToApplication(Process toSwitchTo)
{
SwitchProcess(toSwitchTo);
}
public static void SwitchToLauncher()
{
FrontendBridge.GetInstance().Reset();
SwitchProcess(Process.GetCurrentProcess());
Taskbar.Hide();
}
private static void SwitchProcess(Process toSwitchTo)
{
if (currentProcess == toSwitchTo)
return;
if (toSwitchTo.MainWindowHandle != IntPtr.Zero)
{
SwitchToThisWindow(toSwitchTo.MainWindowHandle,true);
}
currentProcess = toSwitchTo;
}
希望有人有一些想法,或者已经在过去类似的问题。
如果您需要任何附加信息或源代码位,请告诉我。
不要使用'SwitchToThisWindow'。研究更多的选择。也可以尝试以管理员身份运行以查看是否有差异。 – SimpleVar
感谢您的评论。如上所述,我尝试了两种不同的方法,但结果相同。我也尝试作为管理员运行,这并没有什么区别(将更新上面这个)。 – user3550959