开发者

Removing the icon from a WPF window when running outside of Visual Studio

I've used the code in Removing Icon from a WPF window to remove the icon from the window of an application (using the attached property answer) and this has worked a treat, when run via Visual Studio 2010. When the application is run normally, the icon still appears.

The window has no icon assigned to its Icon property, the application does, however, have an icon defined in its properties (Application > Resources > Icon) which is the one that's being shown as the window icon.

How can I resolve this difference in开发者_如何转开发 behaviour so that the icon isn't shown when the application runs outside of Visual Studio 2010?


I did a bit of digging; there's a StackOverflow question that addresses your issue. Ironically, this fix only works outside of Visual Studio.

Relevant Parts of the Answer (by Zach Johnson):

It appears that WS_EX_DLGMODALFRAME only removes the icon when the WPF window's native Win32 window does not have an icon associated with it. WPF (conveniently) uses the application's icon as the default icon for all windows without an explicitly set icon. Normally, that doesn't cause any problems and saves us the trouble of manually setting the application's icon on each window; however, it causes a problem for us when we try to remove the icon.

Since the problem is that WPF automatically sets the window's icon for us, we can send WM_SETICON to the Win32 window to reset its icon when we are applying WS_EX_DLGMODALFRAME.

const int WM_SETICON = 0x0080;
const int ICON_SMALL = 0;
const int ICON_BIG = 1;

[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr SendMessage(
    IntPtr hWnd, 
    int msg,
    IntPtr wParam, 
    IntPtr lParam);

Code to remove the icon:

IntPtr hWnd = new WindowInteropHelper(window).Handle;
int currentStyle = NativeMethods.GetWindowLongPtr(hWnd, GWL_EXSTYLE);

SetWindowLongPtr(
    hWnd,
    GWL_EXSTYLE,
    currentStyle | WS_EX_DLGMODALFRAME);

// reset the icon, both calls important
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_SMALL, IntPtr.Zero);
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_BIG, IntPtr.Zero);

SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, 
    SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);

It works only when the app is run outside of Visual Studio.


Maybe the Shell integration library is an option for you? It contains this WindowChrome class to customize the non-client area, allowing you to leave out the icon.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜