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

WPF-从模式窗口中删除系统菜单图标,但不从主应用程序窗口中删除,wpf,menu,system,icons,Wpf,Menu,System,Icons,我正在尝试(在WPF中): 有一个.exe文件,可以像普通文件一样显示系统菜单图标(窗口左上角的图标) 此图标未显示在此应用程序调用的模式窗口中 我在这里尝试了解决方案: 这起作用了。同样的东西有一个可下载的样本,网址是: 但是,如果我将.ico文件添加到.exe的项目属性(属性->应用程序->图标和清单),它将停止工作。您可以在可下载的示例中尝试这一点 似乎.exe中的图标也在模式窗口中使用(我们在.dll文件中有该图标),即使该.dll的属性显示为“默认图标”。它必须从.exe中传递。那

我正在尝试(在WPF中):

  • 有一个.exe文件,可以像普通文件一样显示系统菜单图标(窗口左上角的图标)
  • 此图标未显示在此应用程序调用的模式窗口中
  • 我在这里尝试了解决方案:

    这起作用了。同样的东西有一个可下载的样本,网址是:

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

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

    可能,一个更简单的问题是:即使在项目的属性中指定了.ico文件,也可以删除图标吗

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


    谢谢你的帮助。

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

    因为问题是WPF会自动为我们设置窗口的图标,所以当我们应用
    WS\u EX\u DLGMODALFRAME
    时,我们可以发送到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之外运行时才有效