2015-01-04 37 views
0

关于我第一次创作的背景。这是一个基于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; 
} 

希望有人有一些想法,或者已经在过去类似的问题。
如果您需要任何附加信息或源代码位,请告诉我。

+0

不要使用'SwitchToThisWindow'。研究更多的选择。也可以尝试以管理员身份运行以查看是否有差异。 – SimpleVar

+0

感谢您的评论。如上所述,我尝试了两种不同的方法,但结果相同。我也尝试作为管理员运行,这并没有什么区别(将更新上面这个)。 – user3550959

回答

0

所以我设法解决这个问题。

事实证明,这个问题不是由于我的任何代码围绕那些API调用或正在切换到自己的应用程序。

突破回答是从这里:
http://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo

这解释了如何在调试的时候你被允许设置前台窗口,但没有调试窗口必须是最后一个拿到键盘输入,否则它赢得了”没有焦点。

解决方法是让代码保存alt键让窗口允许我的程序设置前景窗口,然后SetForegroundWindow或SwitchToThisWindow(当切换到可能尚未打开的东西时,我有更好的结果)使用。

我发现这里使用此代码的人的一个例子:
http://csharpapprentice.blogspot.co.nz/2013/03/ok-ok-its-c.html