2009年7月28日 星期二

在WPF中將視窗從Alt-Tab List中隱藏

有時候一支應用程式常常不只一個視窗
但是預設會讓所有的視窗都出現在Alt-Tab的list裡面
不僅讓使用者在使用時會混淆
甚至造成一些像是順序錯誤之類的錯誤
這時可以將視窗的屬性設成toolwindow(fixed or sizable)
然後將ShowInTaskbar設成false就可以隱藏了

public void HideInAltTab(Window w)
{
w.WindowStyle = WindowStyle.ToolWindow;
w.ShowInTaskbar = false;
}

只不過此時window的型態就變成tool window
title比較細小,而且右上角的控制只剩下關閉
最大和最小化都沒有了

不過如果是第二或第三個視窗的話
有時會希望window的邊界風格是none
那還是可以的
依照先前的方法,不過先將WindowStyle設成none
然後用user32里面提供的API,將GWL_EXSTYLE(-20)屬性
設成WS_EX_TOOLWINDOW(0x80)

public const int GWL_EXSTYLE = -20;
public const int WS_EX_TOOLWINDOW = 0x00000080;

[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hWnd,
int nIndex, IntPtr dwNewLong);

[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd,
int nIndex);

public void HideInAltTab(Window w)
{
/// change the window style to none
w.WindowStyle = WindowStyle.None;
w.ShowInTaskbar = false;

/// get the handle of w
IntPtr h = GetHandle(w);

/// set the window extend style to tool window
SetWindowLong(h, GWL_EXSTYLE, new IntPtr(
GetWindowLong(h, GWL_EXSTYLE) |
WS_EX_TOOLWINDOW));
}

其中取得Handle的函式請參考 在WPF中找出window的handle

沒有留言:

張貼留言