隐藏WPF窗口中的图标

ygo*_*goe 7 wpf icons window

我知道有很多关于隐藏或删除WPF窗口左上角图标的问题,这是系统菜单所在的位置.我尝试了很多但没有效果.这是我的要求:

  • 图标消失,不占用任何空白区域(即没有透明图标)
  • 窗口标题直接从窗口的左边缘开始
  • 右上角的关闭按钮仍在那里工作
  • 如果启用,最小化/最大化按钮仍然存在(可选,不测试此)
  • 没有自定义绘制整个窗口框架
  • 适用于启用了Aero Glass的Windows 7(Windows 8任何人?)
  • 适用于32位和64位Windows(x86和x64版本)
  • 适用于WPF .NET 4.0
  • 不在像Visual Studio这样的调试器中工作(如果它也可以在调试器中工作,会很好)
  • 也应该适用于Windows XP(可选)

可用的答案基本上使用Windows API函数GetWindowLong,SetWindowLong有时还SetWindowPos添加扩展窗口样式WS_EX_DLGMODALFRAME和调用SWP_FRAMECHANGED.有时,其他样式也会设置或取消设置.

不幸的是,这根本不起作用.我可以没有没有关闭按钮的图标,或者两者都在那里.但同样值得注意的是,所有这些内容都来自2010年或预告片.它似乎是针对早期的.NET或Windows版本而失败了.

我已经将系统对话框(来自资源管理器)和我的WPF窗口的窗口样式与Microsoft Spy ++(包含在Visual Studio中)进行了比较.但我可以尝试将所有标志设置为相同,图标不会消失.就像黑魔法一样,它会推翻所有其他API函数或物理.

有没有人能够在今天和指定环境中使用仍然有效的解决方案?

She*_*dan 25

如果您刚刚将标题中的单词放入搜索引擎而不是像我刚才那样,那么您会发现比这些更多的结果.你可以在下面找到你的答案:

从WPF窗口中删除图标

是否可以在标题栏中显示没有图标的wpf窗口?

如何删除WPF窗口的图标

如何从窗口标题栏中删除图标

如何在WPF中隐藏窗口图标


你对此的最新评论不适用于大规模的应用程序让我感到惊讶.因此,我随后将代码添加到大型应用程序中,并再一次正常工作.但是,我继续测试这一点,你必须使用一个RibbonWindow在你的应用程序,因为当我测试了一个大规模应用该代码RibbonWindow的代码并没有工作.

如果您正在使用法线,请Window尝试使用此代码(来自@ MichalCiechan对第一个链接帖子的回答):

首先添加这个类:

public static class IconHelper
{
    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hwnd, int index);

    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, 
int y, int width, int height, uint flags);

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr 
lParam);

    const int GWL_EXSTYLE = -20;
    const int WS_EX_DLGMODALFRAME = 0x0001;
    const int SWP_NOSIZE = 0x0001;
    const int SWP_NOMOVE = 0x0002;
    const int SWP_NOZORDER = 0x0004;
    const int SWP_FRAMECHANGED = 0x0020;
    const uint WM_SETICON = 0x0080;

    public static void RemoveIcon(Window window)
    {
        // Get this window's handle
        IntPtr hwnd = new WindowInteropHelper(window).Handle;
        // Change the extended window style to not show a window icon
        int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);
        // Update the window's non-client area to reflect the changes
        SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | 
SWP_NOZORDER | SWP_FRAMECHANGED);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到MainWindow.xaml.cs:

protected override void OnSourceInitialized(EventArgs e)
{
    IconHelper.RemoveIcon(this);
}
Run Code Online (Sandbox Code Playgroud)

哦......另外还有一件事需要注意......如果你设置了Window.Icon属性,它就行不通了,但是如果你不想出现一个图标,我猜你还没有这样做.

  • @LonelyPixel,我已经为你更新了我的帖子,证明了我测试过的一个工作示例...也许你可以收回你留下的粗鲁评论并立即删除不应当的downvote? (4认同)
  • 也许谢里登应该编辑第一句话——对于未来使用谷歌到达这里的读者来说,这种粗鲁是必要的。 (3认同)
  • 抱歉,我都看过了,但没有任何作用。从您的回答中,我发现您没有阅读我的问题,尤其是没有验证这些建议是否确实有效。 (2认同)
  • 我发现了一个区别:我的.exe文件包含图标资源后,该图标将在窗口中使用。如果我将项目设置保留为“默认图标”,并且不将其他非托管图标添加到我的.exe文件中,那么它将起作用。但是,只要有一个图标,就会显示出来。 (2认同)
  • @Sheridan _"如果你刚刚将标题中的单词放入搜索引擎而不是像我刚才那样,那么你会发现比这些更多的结果."_ - 虽然当时可能很有用,但我觉得它不再相关.我用**Google**搜索短语_"隐藏wpf窗口图标"_**第一场比赛**落在这里.考虑**删除****第一句**. (2认同)

小智 12

从具有图标的WPF应用程序创建对话框窗口时,上述操作无效.但是,添加以下两行时,图标会从对话框窗口中正确消失:

SendMessage(hwnd, WM_SETICON, new IntPtr(1), IntPtr.Zero);
SendMessage(hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)

(sa https://connect.microsoft.com/VisualStudio/feedback/details/745230/wpf-window-cannot-be-displayed-without-titlebar-icon)