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?
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. –
Evet, beklediğim buydu. Peki buna yaklaşmanın daha iyi bir yolu ne olurdu? – dsfgsho
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. –