Удаление значка из окна WPF при запуске вне Visual Studio - PullRequest
7 голосов
/ 12 апреля 2011

Я использовал код в Удаление Icon из окна WPF , чтобы удалить значок из окна приложения (используя ответ в прикрепленном свойстве), и это сработало, когда запустить через Visual Studio 2010 . Когда приложение работает нормально, значок все равно появляется.

У окна нет значка, назначенного его свойству Icon, однако приложение имеет значок, определенный в его свойствах (Приложение> Ресурсы> Значок), который отображается в виде значка окна.

Как устранить эту разницу в поведении, чтобы значок не отображался, когда приложение работает за пределами Visual Studio 2010?

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

Я немного покопался;есть вопрос StackOverflow , который решает вашу проблему.По иронии судьбы, это исправление работает только за пределами Visual Studio.

Соответствующие части ответа ( Зак Джонсон ):

Похоже, что 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.

0 голосов
/ 07 апреля 2012

Может быть, это поможет вам Скрыть кнопки окна , не только значок окна, но если вам нравится (свернуть, восстановить и закрыть).

0 голосов
/ 07 апреля 2012

Может быть, вам подойдет библиотека интеграции с Shell?Он содержит этот класс WindowChrome для настройки области, не являющейся клиентом, что позволяет вам пропустить значок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...