【问题标题】:WPF - remove system menu icon from modal window, but not main app windowWPF - 从模式窗口中删除系统菜单图标,但不是主应用程序窗口
【发布时间】:2011-03-06 23:57:19
【问题描述】:

我正在尝试做(在 WPF 中):

  1. 有一个 .exe 文件,可以正常显示系统菜单图标(窗口左上角的图标)
  2. 此应用调用的模式窗口中不显示此图标

我在这里尝试了解决方案: Removing Icon from a WPF window

这奏效了。在以下位置有一个可下载的相同示例: http://blogs.msdn.com/b/wpfsdk/archive/2007/08/02/a-wpf-window-without-an-window-icon-the-thing-you-click-to-get-the-system-menu.aspx

但是,如果我将 .ico 文件添加到 .exe 的项目属性(属性 -> 应用程序 -> 图标和清单),它将停止工作。您可以使用可下载的示例进行尝试。

.exe 中的图标似乎也用于模态窗口(我们在 .dll 文件中),即使该 .dll 的属性显示“默认图标”。它必须从 .exe 传递下来。那么,有没有办法在主窗口上显示图标,而不是在子窗口上?

可能,一个更简单的方法是:即使在项目的属性中指定了一个 .ico 文件,是否可以删除图标?

我发现唯一可行的方法是将模式窗口的 WindowStye 设置为“ToolWindow”。这给了我几乎想要的东西:没有图标,“关闭”按钮(右上角的“x”)仍然存在。然而,x 非常小。这是最好的吗?

感谢您的帮助。

【问题讨论】:

    标签: wpf menu system icons


    【解决方案1】:

    我遇到了同样的问题。似乎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 之外运行 时才有效。

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 2010-11-03
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多