1. ホーム
  2. c#

[解決済み】WPFでウィンドウを最前面に表示させる

2022-04-05 18:54:16

質問

WPFアプリケーションをデスクトップの最前面に表示するにはどうしたらよいでしょうか?今のところ、私は試してみました。

SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);

SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);

どれも仕事をしていない( Marshal.GetLastWin32Error() はこれらの操作が正常に完了したことを示しており、各定義の P/Invoke 属性には SetLastError=true ).

空のWPFアプリケーションを新規に作成して SwitchToThisWindow タイマーを使った場合は期待通りに動作するので、なぜ私のオリジナルのケースでは動作しないのかわかりません。

編集 : グローバルホットキーと連動してやっています。

解決方法は?

さて、私は回避策を考え出した。私は、ホットキーを実装するために使用されるキーボードフックから呼び出すようにしています。この呼び出しを一時停止のあるBackgroundWorkerに入れると、期待通りに動作します。このような仕組みになっているのですが、なぜ元々動作していなかったのかが全く分かりません。

void hotkey_execute()
{
    IntPtr handle = new WindowInteropHelper(Application.Current.MainWindow).Handle;
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(delegate
        {
            Thread.Sleep(10);
            SwitchToThisWindow(handle, true);
        });
    bg.RunWorkerAsync();
}