2010-02-26 78 views
15

我能夠使用WinApi的從WPF窗口中刪除窗口圖標,但是當我只運行WPF項目的可執行文件時,我再次在應用程序窗口中獲取圖標。從WPF窗口中刪除圖標

如何刪除圖標?

+2

WPF窗口和應用程序窗口有什麼區別。 如果您想要回答新問題,請接受以前問題的答案。 – Timores 2010-02-26 11:56:04

+0

是的,請先接受以前問題的答案。 – 2010-02-26 11:57:28

+0

@LdnCobra,很好的答案,但你沒有給shraddha接受老問題的答案的動機:-) – Timores 2010-02-26 12:08:33

回答

10

我已經從 'LnDCobra' 修改的樣本,因此它可以被用作附加屬性(如「Thomas的建議:

<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 2011-04-12 12:48:14

+4

對我來說,這在調試模式下工作正常,但如果我在調試環境外運行它,則不會。 – 2012-01-25 15:46:34

+0

接受的答案在.NET4.5中不起作用,而您的答案適用於我。謝謝! 從調試模式的視覺工作室,以及從Windows資源管理器運行exe工作。 – sudarsanyes 2014-07-08 07:19:09

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 ....其中米沒有使用視覺工作室運行項目 – shraddha 2010-02-26 12:19:34

+0

@LnDCobra:好的答案,+1。需要注意的是,你可以很容易地實現這個作爲一個附加屬性,這將使聲明刪除的圖標,在XAML – 2010-02-26 12:41:00

+0

伊茨得到去除 我的問題是exe文件 – shraddha 2010-02-26 13:14:39

3

我只是使用非常小的透明圖像作爲WPF窗口的圖標(1x1像素)。

1

只需添加此WindowStyle="ToolWindow"添加到您的窗口屬性。

+0

不錯。但是這也隱藏了最大化/最小化按鈕 – 2017-10-10 10:32:58