2013-06-25 25 views
5

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?

+0

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ó. –

+0

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

+0

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. –

Trả lời

4

Các giải pháp để giữ kiểu trực quan của một cửa sổ WPF để hoạt động ngay cả khi cửa sổ mất tập trung để xử lý các WM_NCACTIVATE như thế này:

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