2013-06-25 158 views
5

特定のWPFウィンドウにフォーカスを当てようとしています。つまり、標準のWindowsタスクバーのようにフォーカスを失ったときにウィンドウスタイルを変更しないでください。これを達成するために、WndProcにフックして、WM_NCACTIVATEまたはWM_ACTIVATEがfalse(wParam == 0)に設定されているかどうかを確認し、メッセージをhandled = true;とマークしてウィンドウが非アクティブにならないようにします。ここではいくつかのサンプルコードは、次のとおりです。スタートアップウィンドウでWM_NCACTIVATEを処理すると他のすべてのウィンドウがブロックされる

void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    var source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); 
    if (source != null) source.AddHook(WndProc); 
} 

private const uint WM_NCACTIVATE = 0x0086; 
private const int WM_ACTIVATE = 0x0006; 
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == WM_NCACTIVATE) 
    { 
     if (wParam == new IntPtr(0)) 
      handled = true; 
    } 
    if (msg == WM_ACTIVATE) 
    { 

     if (wParam == new IntPtr(0)) 
      handled = true; 
    } 
    return IntPtr.Zero; 
} 

ただし、これを行うことにより、

var f = new Window(); 
f.ShowDialog(); 

このメインウィンドウ内から作成されている他のすべてのWPFウィンドウがフォーカスを受け取ることはありませんし、彼らが表示されているものの、窓はありませんクライアント領域とWindowsの最小化、最大化、および閉じるボタンの両方でユーザーの入力に反応しません。私は明らかに何か間違ったことをしているので、これを正しい方法で行うためのアドバイスや指針はありますか?

+0

コードはちょうどあなたがそれがない期待し何をしません。単にWPFにメッセージが表示されないようにします。ウィンドウはまだアクティブですが、WPFはそれを認識しません。だから絶望的に混乱します。ウィンドウの非アクティブ化を防止するには、WPFにはない武器が必要です。 –

+0

はい、それは私が期待したものでした。では、これにアプローチするにはどうすればよいでしょうか? – dsfgsho

+0

アプローチ*何*?タスクバーには「スタイル」がありませんので、あなたが解決しようとしている問題は完全には不明です。 WPFはタスクバーの作成を直接サポートしていないので、SHAppBarMessage()をピンボークスで作成します。それはうまくいく。 –

答えて

4

ウィンドウがフォーカスを失った場合でもアクティブにWPFウィンドウのビジュアルスタイルを維持するソリューションは、このようなWM_NCACTIVATEを処理することです:

private const uint WM_NCACTIVATE = 0x0086; 

private IntPtr WndProc(IntPtr hwnd, int msg, 
     IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    var returnvalue = IntPtr.Zero; 
    if (msg == WM_NCACTIVATE) 
    { 
     //replace the wParam (true/false) which indicates 
      //active/inactive with always true 
     returnvalue = DefWindowProc(hwnd, WM_NCACTIVATE, 
        new IntPtr(1), new IntPtr(-1)); 
     handled = true; 
    } 
} 


[DllImport("user32.dll")] 
static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages uMsg, IntPtr wParam, IntPtr lParam); 
関連する問題