在Visual Studio外部运行时从WPF窗口中删除图标

时间:2011-04-12 13:57:21

标签: c# .net wpf visual-studio-2010 .net-4.0

我已经使用Removing Icon from a WPF window中的代码从应用程序的窗口中删除了图标(使用附加的属性答案),这通过Visual Studio 2010运行时得到了一个好处, STRONG>。当应用程序正常运行时,图标仍会显示。

窗口没有为其Icon属性分配图标,但应用程序确实在其属性中定义了一个图标(应用程序>资源>图标),该图标显示为窗口图标。

如何解决这种行为差异,以便在Visual Studio 2010外部运行应用程序时不显示图标?

3 个答案:

答案 0 :(得分:2)

我做了一些挖掘;有一个StackOverflow question可以解决您的问题。具有讽刺意味的是,此修复只能在Visual Studio之外使用。

答案的相关部分(Zach Johnson):

当WPF窗口的本机Win32窗口没有与之关联的图标时,WS_EX_DLGMODALFRAME似乎仅删除图标。 WPF(方便地)使用应用程序的图标作为所有窗口的默认图标,没有明确设置的图标。通常情况下,这不会导致任何问题,并且可以省去在每个窗口上手动设置应用程序图标的麻烦。但是,当我们尝试删除图标时,它会给我们带来问题。

由于问题是WPF会自动为我们设置窗口的图标,因此我们可以在应用WS_EX_DLGMODALFRAME时将WM_SETICON发送到Win32窗口以重置其图标。

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);

删除图标的代码:

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);

仅当应用程序在Visual Studio外部 运行时才有效。

答案 1 :(得分:0)

也许Shell集成库是您的选择?它包含此WindowChrome类来自定义非客户区域,允许您省略图标。

答案 2 :(得分:0)

也许这会帮助你Hide the Window Buttons,不仅仅是窗口的图标,还有你喜欢的 (最小化,恢复和关闭)。