WPF没有提供任何功能来移除窗体上的icon图标。一般的做法是设置一个空白的图标,如下图1:
比较好的做法是使用Win32API提供的函数来移除这个图标。使用如下的代码:
public static class IconHelper{[DllImport("user32.dll")]static extern int GetWindowLong(IntPtr hwnd, int index);[DllImport("user32.dll")]static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);[DllImport("user32.dll")]static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,int x, int y, int width, int height, uint flags);[DllImport("user32.dll")]static extern IntPtr SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam);const int GWL_EXSTYLE = -20;const int WS_EX_DLGMODALFRAME = 0x0001;const int SWP_NOSIZE = 0x0001;const int SWP_NOMOVE = 0x0002;const int SWP_NOZORDER = 0x0004;const int SWP_FRAMECHANGED = 0x0020;const uint WM_SETICON = 0x0080;public static void RemoveIcon(Window window){//获取窗体的句柄IntPtr hwnd = new WindowInteropHelper(window).Handle;//改变窗体的样式int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);//更新窗口的非客户区,以反映变化SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE |SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);}}
在窗体中只需重载OnSourceInitialized函数即可protected override void OnSourceInitialized(EventArgs e){IconHelper.RemoveIcon(this);}
效果图:空白没有了。