2013-06-25 9 views
5

diğer tüm pencereler. Bunu başarmak için, ben WM_NCACTIVATE veya WM_ACTIVATE yanlış (wParam == 0) ayarlanır ve daha sonra inaktif olmaktan Pencere engellemek için handled = true; olarak işaretlemesi olup olmadığını kontrol etmek için WndProc içine kanca. İşte bazı örnek kod:Handling WM_NCACTIVATE ben, odakta belirli bir WPF penceresini tutmaya çalışıyorum (standart Windows Görev gibi mesela) odağı kaybetmeden zaman pencere stilini değiştirmek gerektiğini anlam am

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

bunu yaparak, Ancak bu ana penceresi içinde oluşturulan tüm diğer WPF pencereleri

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

odağı hiçbir zaman almazlar ve bunlar görünür olmasına rağmen, pencere yapar Hem istemci alanında hem de Windows için simge durumuna küçültme, büyütme ve kapama düğmesi kullanıcı girdisine tepki vermez. Açıkçası yanlış bir şey yapıyorum, bu yüzden doğru yolu nasıl yapacağınız konusunda herhangi bir tavsiye veya işaretçi?

+0

kod sadece öyle umut ne yapmaz. Sadece WPF'nin mesajı görmesini engeller. Pencere hala etkin ama WPF bunu bilmiyor. Bu yüzden umutsuzca kafam karıştı. Pencere aktivasyonunun önlenmesi, WPF'nin sahip olmadığı çok daha büyük bir silah gerektirir. –

+0

Evet, beklediğim buydu. Peki buna yaklaşmanın daha iyi bir yolu ne olurdu? – dsfgsho

+0

Yaklaşım * ne *? Bir görev çubuğunun "stili" yoktur, bu yüzden çözmek istediğiniz problemin ne olduğu tamamen açık değildir. WPF doğrudan görev çubukları oluşturmayı desteklemez, SHAppBarMessage() 'yi pinvoking yaparak bir tane oluşturun. Bu iyi bir şey. –

cevap

4

pencere odağı kaybetse bile aktif bir WPF penceresinin görsel stili tutarak çözüm böyle WM_NCACTIVATE idare etmektir:

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); 
İlgili konular