在visualstudio之外运行时,从WPF窗口中删除图标

本文关键字:窗口 WPF 删除 图标 visualstudio 运行时 | 更新日期: 2023-09-27 17:49:42

我已经使用了从WPF窗口中删除图标的代码来从应用程序的窗口中删除图标(使用附加的属性答案),这已经起作用了,当通过Visual Studio 2010运行时。当应用程序正常运行时,图标仍然出现。

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

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

在visualstudio之外运行时,从WPF窗口中删除图标

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

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

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

由于问题是WPF自动为我们设置窗口的图标,我们可以将wm_secticon发送到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 之外运行时才有效

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