1

新しいインスタンス用にミューテックスを作成できなかった場合に、アプリケーションをフォアグラウンドに移動する最善の方法を誰かが教えてくれるかどうか疑問に思っていました。

例: アプリケーション X は実行中ですが、バックグラウンドにあります。見えないので、別のインスタンスを実行しようとしました。ミューテックスは false を返すため、最善の方法は、既存のインスタンスをフォアグラウンドにすることです。

独自のアプリケーションとやり取りするための最良の方法を知っている人はいますか?ただし、別のプロセスからですか?

4

4 に答える 4

2

他のアプリケーションのメイン ウィンドウへの hWnd を取得する必要があります。その方法を覚えている唯一の方法は、自分のウィンドウが見つかるまですべてのウィンドウをループすることです。もっと直接的な方法があるかもしれません

[DllImport("user32.dll")] private static extern 
              int EnumWindows(EnumWindowsProc ewp, int lParam); 

public delegate bool EnumWindowsProc(int hWnd, int lParam);

public void EnumerateAllWindows()
{
   EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
   EnumWindows(ewp, 0);
 }

private bool EvalWindow(int hWnd, int lParam)
{
    //this will be called for each window..         
    // use GetWindowThreadProcessId to get the PID for each window
    // and use Process.GetProcessById to get the PID you are looking for
    // then bring it to foregroun using of these calls below:

}

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll")]
    public static extern bool BringWindowToTop(IntPtr hWnd);

    DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd
于 2009-11-14T11:25:53.733 に答える
2

最初のインスタンスでイベントを発生させることにより、アプリケーションの 2 番目のインスタンスが最初のインスタンスと通信できるようにする機能が .Net に組み込まれています。VB.Net の一部ですが、C# でも使用できます。

ただし、バグに注意することは非常に重要です。一部のファイアウォールでは、インスタンスを1 つでも開くことができません。起動時にアプリケーションがクラッシュします。詳細と代替手法については、Bill McCarthy によるこの優れた記事を参照してください。彼は、.NET 3.5 のパイプを使用して、2 番目のインスタンスから最初のインスタンスに通信します。それを使うことをお勧めします。彼のコードは VB.Net ですが、おそらくTelerik を使用して C# に変換できます。

于 2009-11-14T14:17:44.703 に答える
0

とにかく、forceForegroundWindowのグーグル(Windowsを使用している場合)

于 2010-02-23T17:32:05.420 に答える