Tôi đang cố gắng giữ một cửa sổ WPF cụ thể trong tiêu điểm, nghĩa là không nên thay đổi kiểu cửa sổ khi mất tiêu điểm (ví dụ như Windows Taskbar chuẩn). Để đạt được điều này, tôi móc vào WndProc
để kiểm tra xem WM_NCACTIVATE
hoặc WM_ACTIVATE
được đặt trên false (wParam == 0
) và sau đó đánh dấu thư là handled = true;
để chặn Cửa sổ không hoạt động. Dưới đây là một số mã ví dụ:Xử lý WM_NCACTIVATE trong cửa sổ khởi động chặn tất cả các cửa sổ khác
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;
}
Tuy nhiên, bằng cách làm này, tất cả các cửa sổ WPF khác được tạo ra từ bên trong cửa sổ chính này
var f = new Window();
f.ShowDialog();
không bao giờ nhận lấy nét và mặc dù họ có thể nhìn thấy, cửa sổ làm không phản ứng với đầu vào của người dùng cả trong khu vực khách hàng mà còn cho Windows thu nhỏ, tối đa hóa và đóng nút. Tôi rõ ràng đang làm điều gì đó sai trái, vì vậy bất kỳ lời khuyên hay chỉ dẫn nào về cách làm điều này đúng cách?
Mã này chỉ không làm những gì bạn hy vọng nó làm. Nó chỉ ngăn WPF nhìn thấy thông báo. Cửa sổ vẫn được kích hoạt nhưng WPF không biết. Vì vậy, vô cùng bối rối. Ngăn chặn cửa sổ de-kích hoạt đòi hỏi một vũ khí lớn hơn nhiều, một trong những WPF không có. –
Vâng, đó là những gì tôi mong đợi. Vậy thì cách nào tốt hơn để tiếp cận điều này? – dsfgsho
Cách tiếp cận * những gì *? Thanh tác vụ không có "kiểu" vì vậy hoàn toàn không rõ vấn đề bạn đang cố giải quyết. WPF không trực tiếp hỗ trợ tạo thanh tác vụ, bạn tạo một thanh tác vụ bằng cách ghim SHAppBarMessage(). Điều đó googles tốt. –