gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:55:27 24 4
gpt4 key购买 nike

我正在尝试做(在 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 的项目属性(属性 -> 应用程序 -> 图标和 list ),它就会停止工作。您可以使用可下载的示例进行尝试。

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

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

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

感谢您的帮助。

最佳答案

我遇到了同样的问题。似乎 WS_EX_DLGMODALFRAME 仅在 WPF 窗口的 native Win32 窗口没有与之关联的图标时才删除图标。 WPF(方便地)使用应用程序的图标作为所有窗口的默认图标,而无需明确设置图标。通常,这不会造成任何问题,并且省去了我们在每个窗口上手动设置应用程序图标的麻烦;但是,当我们尝试删除图标时,这会给我们带来问题。

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

关于WPF - 从模式窗口中删除系统菜单图标,但不是主应用程序窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3096359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com