1

私が最初に作っているものの背景のビット。これは 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;
}

うまくいけば、誰かが何らかのアイデアを持っているか、過去に同様の問題を抱えていました。
追加情報やソースコードが必要な場合はお知らせください。

4

1 に答える 1

1

だから私はこれを修正することができました。

この問題は、これらの 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

于 2015-01-12T00:31:24.487 に答える