关于我先做的事情的一些背景知识。它是一个基于C#的启动程序,可以在主要的家庭影院媒体播放器(在我的情况下,Plex,MediaPortal和Kodi)之间轻松切换,因此它们都可以用于各自的优点(Plex用于下载内容,MediaPortal用于电视)录音和直播电视,Kodi用于其他一切,通常是流媒体) 这些应用程序暂停使用pssuspend,这意味着它们可以一次保持打开状态,这对慢速计算机来说非常有用。
用户按下按钮(在遥控器上)切换回启动器以选择其他应用程序。
我几乎处于一个可用的版本,但我已经解决了一段时间的问题。
如果我的启动器切换到应用程序(使用下面提到的方法),我无法切换回启动器进程。
此仅在以下时间发生:
在所有其他时间,一切都按预期工作。
要切换,我目前正在使用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)。
这两者都有相同的结果。
我确认的事情与此问题无关:
不应该是一个问题,但应该注意以防万一,是发射器的前端全部使用CefSharp(CEF是Chrome浏览器的集成版本)。 虽然这个问题在添加之前就已经发生了。
我的潜在想法:
AppActivate
中提到的事情,我意识到UIPermission级别可能很重要,但是手动设置为完全信任不会有任何改变。我的应用的一些代码在上下文中切换:
[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 :(得分: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