2013-06-25 17 views
5

Ich versuche, ein bestimmtes WPF-Fenster im Fokus zu halten, was bedeutet, dass es den Fensterstil nicht ändern sollte, wenn der Fokus verloren geht (z. B. wie die Standard-Windows-Taskleiste). Um dies zu erreichen, hake ich in die WndProc ein, um zu prüfen, ob WM_NCACTIVATE oder WM_ACTIVATE auf false (wParam == 0) gesetzt ist, und markiere dann die Nachricht als handled = true;, um zu verhindern, dass das Fenster inaktiv wird. Hier einige Beispiel-Code:Handhabung von WM_NCACTIVATE im Startfenster blockiert alle anderen Fenster

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; 
} 

jedoch durch dies zu tun, alle anderen WPF Fenster, die aus diesem Hauptfenster erstellt werden

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

nie den Fokus erhalten und obwohl sie sichtbar sind, wird das Fenster tut nicht auf Benutzereingaben sowohl im Client-Bereich, sondern auch für die Windows-Schaltfläche minimieren, maximieren und schließen reagieren. Ich mache offensichtlich etwas falsch, also irgendwelche Ratschläge oder Hinweise, wie man das richtig macht?

+0

Der Code einfach nicht tun, was Sie hoffen, dass es funktioniert. Es verhindert lediglich, dass WPF die Nachricht nicht sehen kann. Das Fenster ist immer noch aktiviert, aber WPF weiß es nicht. So wird hoffnungslos verwirrt. Die Deaktivierung der Fenster erfordert eine viel größere Waffe, die WPF nicht hat. –

+0

Ja, das habe ich erwartet. Also, was wäre ein besserer Weg, um das zu erreichen? – dsfgsho

+0

Ansatz * was *? Eine Taskleiste hat keinen "Stil", so dass es völlig unklar ist, welches Problem Sie lösen möchten. WPF unterstützt das Erstellen von Taskleisten nicht direkt. Erstellen Sie eine Task, indem Sie SHAppBarMessage() pinvokieren. Das passt gut. –

Antwort

4

Die Lösung den visuellen Stil eines WPF-Fenster aktiv, auch wenn das Fenster den Fokus verliert zu halten, ist die WM_NCACTIVATE so zu handhaben:

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);