У меня была такая же проблема.Похоже, что WS_EX_DLGMODALFRAME
удаляет значок только тогда, когда собственное окно Win32 окна WPF не имеет значка, связанного с ним.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.