代码之家  ›  专栏  ›  技术社区  ›  Nick R.

WPF-从模式窗口中删除系统菜单图标,但不从主应用程序窗口中删除

  •  3
  • Nick R.  · 技术社区  · 15 年前

    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文件,是否也可以删除图标?

    谢谢你的帮助。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Zach Johnson    15 年前

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

    WM_SETICON .

    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的。

    推荐文章