窗口切换所需的VisualStudio调试

时间:2015-01-04 07:45:38

标签: c# visual-studio-2010 winapi task-switching

关于我先做的事情的一些背景知识。它是一个基于C#的启动程序,可以在主要的家庭影院媒体播放器(在我的情况下,Plex,MediaPortal和Kodi)之间轻松切换,因此它们都可以用于各自的优点(Plex用于下载内容,MediaPortal用于电视)录音和直播电视,Kodi用于其他一切,通常是流媒体) 这些应用程序暂停使用pssuspend,这意味着它们可以一次保持打开状态,这对慢速计算机来说非常有用。

用户按下按钮(在遥控器上)切换回启动器以选择其他应用程序。

我几乎处于一个可用的版本,但我已经解决了一段时间的问题。

如果我的启动器切换到应用程序(使用下面提到的方法),我无法切换回启动器进程。

在以下时间发生:

  • VisualStudio未调试或“Visual Studio托管过程”(该过程的vshost版本)正在运行。
  • 键盘/远程输入已应用于要切换到的应用程序
    • 即:如果我向下移动到应用程序切换到我可以回到启动器罚款,但只要我按下应用程序中的任何其他内容我就无法切换。
  • 切换到已启用的应用程序的 out ,而不是从启动器切换到该应用程序。

在所有其他时间,一切都按预期工作。

要切换,我目前正在使用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;
}

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

1 个答案:

答案 0 :(得分:0)

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

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

突破性答案来自这里:
http://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo

这解释了在调试时如何允许设置前景窗口,但是如果没有调试,窗口必须是最后一个获取键盘输入的窗口,否则它将没有焦点。

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

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