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?
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. –
Ja, das habe ich erwartet. Also, was wäre ein besserer Weg, um das zu erreichen? – dsfgsho
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. –