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

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

我使用了 Removing Icon from a WPF window 中的代码从应用程序的窗口中删除图标(使用附加的属性答案),这很有效,当通过 Visual Studio 2010 运行时。当应用程序正常运行时,图标仍然出现。

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

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

最佳答案

我做了一些挖掘;有一个StackOverflow question这解决了你的问题。具有讽刺意味的是,此修复仅适用于 Visual Studio 之外。

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

WS_EX_DLGMODALFRAME 似乎只在 WPF 窗口的 native Win32 窗口没有与之关联的图标时才删除图标。 WPF(方便地)使用应用程序的图标作为所有窗口的默认图标,而无需明确设置图标。通常,这不会造成任何问题,并且省去了我们在每个窗口上手动设置应用程序图标的麻烦;但是,当我们尝试删除图标时,这会给我们带来问题。

由于问题是 WPF 自动为我们设置窗口的图标,我们可以发送 WM_SETICON到 Win32 窗口以在我们应用 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);

删除图标的代码:

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 的外部运行时才有效。

关于c# - 在 Visual Studio 外部运行时从 WPF 窗口中删除图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636391/

相关文章:

c# - 将 future 的本地日期时间转换为 UTC

c# - 如何使用 MEF(托管可扩展性框架)从目录加载 dll

c# - 获取组中的选定单选按钮 (WPF)

c# - 如何在调试中隐藏 xaml ui 元素

c# - 将 zip 文件上传到数据库

c# - 如何在使用 mongo csharp 插入后获取最近插入的文档的 _id?

c# - 使用 WPF 项目一键安装 mongodb

c# - boolean 方法如何不返回区分大小写的 c#

c# - 如何在 VS 2012 中获取 Crystal Reports?

c# - 使用 WPF 自定义控件库 (.NET Framework) 中普通 WPF 项目中的 App.xaml