최신 정보:
@donovan에 따르면 현대 WPF는 설정 ShowInTaskbar="False"
및 Visibility="Hidden"
XAML을 통해 기본적으로이를 지원합니다
. (아직 테스트하지 않았지만 그럼에도 불구하고 댓글 가시성을 높이기로 결정했습니다)
원래 답변 :
Win32 API의 작업 전환기에서 창을 숨기는 방법에는 두 가지가 있습니다.
WS_EX_TOOLWINDOW
확장 된 창 스타일 을 추가하는 것이 올바른 방법입니다.
- 다른 창의 자식 창으로 만듭니다.
안타깝게도 WPF는 Win32처럼 창 스타일에 대한 유연한 제어를 지원하지 않습니다. 따라서 창이있는 창 WindowStyle=ToolWindow
은 기본 WS_CAPTION
및 WS_SYSMENU
스타일 로 끝납니다 . 이로 인해 캡션과 닫기 버튼이 있습니다. 반면을 설정하여이 두 가지 스타일을 제거 할 수 WindowStyle=None
있지만 WS_EX_TOOLWINDOW
확장 된 스타일이 설정 되지 않고 창이 작업 전환기에서 숨겨지지 않습니다.
WindowStyle=None
작업 전환기에서도 숨겨 지는 WPF 창을 가지려면 다음 두 가지 방법 중 하나를 사용할 수 있습니다.
- 위의 샘플 코드를 사용하여 창을 작은 숨겨진 도구 창의 자식 창으로 만듭니다.
WS_EX_TOOLWINDOW
확장 된 스타일 도 포함하도록 창 스타일을 수정합니다 .
개인적으로 두 번째 접근 방식을 선호합니다. 그런 다음 클라이언트 영역에서 유리를 확장하고 어쨌든 캡션에서 WPF 그리기를 활성화하는 것과 같은 고급 작업을 수행하므로 약간의 상호 운용성은 큰 문제가 아닙니다.
다음은 Win32 interop 솔루션 접근 방식에 대한 샘플 코드입니다. 먼저 XAML 부분 :
<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" >
아무것도 너무 우리가 함께 창을 선언, 여기에 공상하지 WindowStyle=None
와 ShowInTaskbar=False
. 또한 확장 된 창 스타일을 수정할 Loaded 이벤트에 핸들러를 추가합니다. 아직 그 시점에 창 핸들이 없기 때문에 생성자에서 그 작업을 할 수 없습니다. 이벤트 핸들러 자체는 매우 간단합니다.
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);
}
그리고 Win32 interop 선언. 샘플 코드를 작게 유지하기 위해 열거 형에서 불필요한 스타일을 모두 제거했습니다. 또한 불행히도 SetWindowLongPtr
Windows XP의 user32.dll 에는 진입 점이 없으므로 SetWindowLong
대신 호출을 라우팅하는 트릭입니다 .
#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