2010-02-26 4 views
15

Я могу удалить значок окна из окна WPF с помощью WinApi, однако снова получаю значок в окне приложения, когда запускаю только исполняемый файл проекта WPF.Удаление значка из окна WPF

Как удалить значок?

+2

В чем разница между окном WPF и окном приложения. И, пожалуйста, примите ответы на предыдущие вопросы, если вы хотите получить ответы на новые вопросы. – Timores

+0

Да, сначала примите ответы на предыдущие вопросы. –

+0

@LdnCobra, отличный ответ, но вы не дали шраддхе стимул принимать ответы на старые вопросы :-) – Timores

ответ

10

Я изменил образец от 'LnDCobra', поэтому он может быть использован в качестве вложенного свойства (как 'Томас' предложил:

<Window 
     ... 
     xmlns:i="clr-namespace:namespace-to-WindowEx" 
     i:WindowEx.ShowIcon = "false" 
     ... 
> 

Реализация WindowEx:

public class WindowEx 
    { 
    private const int GwlExstyle = -20; 
    private const int SwpFramechanged = 0x0020; 
    private const int SwpNomove = 0x0002; 
    private const int SwpNosize = 0x0001; 
    private const int SwpNozorder = 0x0004; 
    private const int WsExDlgmodalframe = 0x0001; 

    public static readonly DependencyProperty ShowIconProperty = 
     DependencyProperty.RegisterAttached(
     "ShowIcon", 
     typeof (bool), 
     typeof (WindowEx), 
     new FrameworkPropertyMetadata(true, new PropertyChangedCallback((d, e) => RemoveIcon((Window) d)))); 


    public static Boolean GetShowIcon(UIElement element) 
    { 
     return (Boolean) element.GetValue(ShowIconProperty); 
    } 

    public static void RemoveIcon(Window window) 
    { 
     window.SourceInitialized += delegate { 
     // Get this window's handle 
     var hwnd = new WindowInteropHelper(window).Handle; 

     // Change the extended window style to not show a window icon 
     int extendedStyle = GetWindowLong(hwnd, GwlExstyle); 
     SetWindowLong(hwnd, GwlExstyle, extendedStyle | WsExDlgmodalframe); 

     // Update the window's non-client area to reflect the changes 
     SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SwpNomove | 
      SwpNosize | SwpNozorder | SwpFramechanged); 
     }; 
    } 

    public static void SetShowIcon(UIElement element, Boolean value) 
    { 
     element.SetValue(ShowIconProperty, value); 
    } 

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

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

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

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

+1 от меня, это сработало, спасибо! – Rob

+4

Для меня это отлично работает в режиме отладки, но нет, если я запустил его вне среды отладки. –

+0

принятый ответ не работал в .NET4.5, пока ваш ответ сработал для меня. благодаря! работал как с визуальной студией в режиме отладки, так и за счет запуска exe из Windows Explorer. – sudarsanyes

19

От WPFTutorial:

Как удалить значок окна WPF

alt text

К сожалению WPF не предоставляет какую-либо функцию, чтобы удалить значок окна. Одним из решений может быть установка значка на прозрачный значок. Но таким образом дополнительное пространство между границей окна и заголовком остается.

Лучшим подходом является использование функции, предоставляемой Win32 API для удаления значка.

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     IconHelper.RemoveIcon(this); 
    } 
} 

Вспомогательный класс, используемый для удаления значка.

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); 
    } 
} 
+4

тот же код, который я использовал, не удаляет значок из окна, когда я запускаю проект только с помощью exe .... где m не используется визуальная студия для запуска проекта – shraddha

+0

@LnDCobra: Хороший ответ, +1. Обратите внимание, что вы могли бы легко осуществить это в качестве вложенного свойства, что позволит извлекать значок декларативен в XAML –

+0

ицами получения удален моя проблема заключается в ее прикреплении все вместе новый значок исполняемого файла – shraddha

3

Я просто использую очень небольшое прозрачное изображение в качестве значка (1x1 px) для окна WPF.

1

Просто добавьте это WindowStyle="ToolWindow" к вашим свойствам окна.

+0

не плохо. Но это скрывает кнопки максимизации/минимизации –

Смежные вопросы