【问题标题】:Removing the icon from a WPF window when running outside of Visual Studio在 Visual Studio 外部运行时从 WPF 窗口中删除图标
【发布时间】:2011-08-03 22:20:02
【问题描述】:

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

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

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

【问题讨论】:

  • 我在一个小型 WPF 应用程序的 MainWindow 中使用了引用答案中的代码来删除图标。它可以在 Visual Studio 中运行,并且在我的项目的 Bin\Debug 文件夹中运行时。是否还有其他一些小细节可能会影响到这一点?

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


【解决方案1】:

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

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

似乎WS_EX_DLGMODALFRAME 仅在 WPF 窗口的本机 Win32 窗口没有与之关联的图标时才删除该图标。 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 之外运行时才有效。

【讨论】:

  • 假设您将 GetWindowLongPtr 和 SetWIndowLongPtr 替换为 GetWindowLong 和 SetWindowLong(对 IntPtr 和 int 进行 ORing,就像使用 currentStyle | WS_EX_DLGMODALFRAME 完成的那样不起作用。不幸的是,此代码对我不起作用。您在放置答案之前是否对其进行了测试?(另外,它不会按原样编译,对于NativeMethods.GetWindowLongPtr,此或引用的答案中都没有代码)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2011-07-28
    • 2013-02-21
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多