Güncelleme:
@Donovan'a göre, modern günlerde WPF bunu XAML'de ayarlayarak ShowInTaskbar="False"
ve yerel olarak destekliyor
Visibility="Hidden"
. (Bunu henüz test etmedim, ancak yine de yorum görünürlüğünü artırmaya karar verdim)
Orijinal cevap:
Win32 API'de görev değiştiriciden bir pencere gizlemenin iki yolu vardır:
WS_EX_TOOLWINDOW
genişletilmiş pencere stilini eklemek için - bu doğru yaklaşımdır.
- onu başka bir pencerenin alt penceresi yapmak için.
Ne yazık ki, WPF pencere stili üzerinde Win32 kadar esnek kontrolü desteklemiyor, bu nedenle WindowStyle=ToolWindow
varsayılan WS_CAPTION
ve WS_SYSMENU
stillere sahip bir pencere , bir başlık ve bir kapatma düğmesine sahip olmasına neden oluyor. Öte yandan, bu iki stili ayarlayarak kaldırabilirsiniz WindowStyle=None
, ancak bu WS_EX_TOOLWINDOW
genişletilmiş stili ayarlamaz ve pencere görev değiştiriciden gizlenmez.
WindowStyle=None
Görev değiştiriciden de gizlenmiş bir WPF penceresine sahip olmak için iki yoldan biri yapılabilir:
- yukarıdaki örnek kodla gidin ve pencereyi küçük bir gizli araç penceresinin alt penceresi yapın
WS_EX_TOOLWINDOW
genişletilmiş stili de içerecek şekilde pencere stilini değiştirin .
Şahsen ikinci yaklaşımı tercih ederim. Sonra yine, camı istemci alanında genişletmek ve yine de altyazıda WPF çizimini etkinleştirmek gibi bazı gelişmiş şeyler yapıyorum, bu nedenle biraz birlikte çalışma büyük bir sorun değil.
İşte Win32 birlikte çalışma çözümü yaklaşımı için örnek kod. İlk olarak, XAML bölümü:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300"
ShowInTaskbar="False" WindowStyle="None"
Loaded="Window_Loaded" >
Burada çok süslü bir şey yok, sadece WindowStyle=None
ve ile bir pencere ilan ediyoruz ShowInTaskbar=False
. Ayrıca, genişletilmiş pencere stilini değiştireceğimiz Loaded olayına bir işleyici de ekliyoruz. Henüz o noktada bir pencere kolu olmadığından, bu işi yapıcıda yapamayız. Olay işleyicisinin kendisi çok basittir:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WindowInteropHelper wndHelper = new WindowInteropHelper(this);
int exStyle = (int)GetWindowLong(wndHelper.Handle, (int)GetWindowLongFields.GWL_EXSTYLE);
exStyle |= (int)ExtendedWindowStyles.WS_EX_TOOLWINDOW;
SetWindowLong(wndHelper.Handle, (int)GetWindowLongFields.GWL_EXSTYLE, (IntPtr)exStyle);
}
Ve Win32 birlikte çalışma bildirimleri. Buradaki örnek kodu küçük tutmak için, tüm gereksiz stilleri numaralandırmalardan kaldırdım. Ayrıca, maalesef SetWindowLongPtr
giriş noktası Windows XP'de user32.dll'de bulunamadı, bu nedenle aramayı SetWindowLong
bunun yerine yönlendirmenin hilesi .
#region Window styles
[Flags]
public enum ExtendedWindowStyles
{
// ...
WS_EX_TOOLWINDOW = 0x00000080,
// ...
}
public enum GetWindowLongFields
{
// ...
GWL_EXSTYLE = (-20),
// ...
}
[DllImport("user32.dll")]
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
int error = 0;
IntPtr result = IntPtr.Zero;
// Win32 SetWindowLong doesn't clear error on success
SetLastError(0);
if (IntPtr.Size == 4)
{
// use SetWindowLong
Int32 tempResult = IntSetWindowLong(hWnd, nIndex, IntPtrToInt32(dwNewLong));
error = Marshal.GetLastWin32Error();
result = new IntPtr(tempResult);
}
else
{
// use SetWindowLongPtr
result = IntSetWindowLongPtr(hWnd, nIndex, dwNewLong);
error = Marshal.GetLastWin32Error();
}
if ((result == IntPtr.Zero) && (error != 0))
{
throw new System.ComponentModel.Win32Exception(error);
}
return result;
}
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", SetLastError = true)]
private static extern IntPtr IntSetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
private static extern Int32 IntSetWindowLong(IntPtr hWnd, int nIndex, Int32 dwNewLong);
private static int IntPtrToInt32(IntPtr intPtr)
{
return unchecked((int)intPtr.ToInt64());
}
[DllImport("kernel32.dll", EntryPoint = "SetLastError")]
public static extern void SetLastError(int dwErrorCode);
#endregion