2015-01-04 58 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