Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 986
Rob Avatar asked Apr 12 '11 13:04

Rob


1 Answers

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.

like image 111
GGulati Avatar answered Oct 17 '22 18:10

GGulati