私が最初に作っているものの背景のビット。これは C# ベースのランチャー プログラムであり、メインのホーム シアター メディア プレーヤー (私の場合は Plex、MediaPortal、Kodi) を簡単に切り替えることができるため、個々のメリット (ダウンロード コンテンツには Plex、TV には MediaPortal) をすべて使用できます。録画とライブ TV、その他すべての場合は Kodi、通常はストリーミング)。
これらのアプリケーションは pssuspend を使用して一時停止されます。つまり、すべてのアプリケーションを一度に開いたままにできるため、低速のコンピューターには最適です。
ユーザーは (リモコンの) ボタンを押してランチャーに戻り、別のアプリケーションを選択します。
私はほぼ使用可能なバージョンですが、しばらくの間問題があり、絞り込みました。
ランチャーがアプリケーションに切り替わると (下記の方法を使用)、ランチャー プロセスに戻ることができません。
これは、次の場合にのみ発生します。
- 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 のインストールと 2 つの Windows 7 のインストール) で同じ問題が発生しています。
- ホーム画面に戻るためのリスナー: これは EventGhost からの UDP ブロードキャストを使用しており、ランチャーのインターフェイスの更新など、実行する必要がある他のすべてのことを行いますが、ランチャーに切り替えません。
- ローカル マシンでのコンパイル: 最初はこれが役立つと思っていましたが、上記の状況が原因でした。私の Windows 8 マシンでコンパイルされたバージョンは、その vshost プロセスが開いている限り、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;
}
うまくいけば、誰かが何らかのアイデアを持っているか、過去に同様の問題を抱えていました。
追加情報やソースコードが必要な場合はお知らせください。