2010-02-26 16 views
15

मैं WinApi का उपयोग करके WPF विंडो से विंडो आइकन को हटाने में सक्षम हूं, हालांकि जब मैं केवल WPF प्रोजेक्ट के निष्पादन योग्य चलाता हूं तो मुझे एप्लिकेशन विंडो में आइकन फिर से मिलता है।एक WPF विंडो से आइकन को हटाने

मैं आइकन कैसे हटा सकता हूं?

+2

डब्ल्यूपीएफ विंडो और एप्लिकेशन विंडो के बीच क्या अंतर है। और यदि आप नए प्रश्नों के उत्तर चाहते हैं तो कृपया पिछले प्रश्नों के उत्तर स्वीकार करें। – 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 में काम नहीं करता था, जबकि आपका उत्तर मेरे लिए काम करता था। धन्यवाद! ने डीबग मोड में दृश्य स्टूडियो से और विंडोज एक्सप्लोरर से एक्सई चलाने के लिए दोनों काम किया। – 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

उसी कोड का मैंने उपयोग किया है, जब मैं प्रोजेक्ट चलाता हूं तो मैं खिड़की से आइकन को नहीं हटाता .... जहां मैं उपयोग नहीं कर रहा हूं परियोजना – shraddha

+0

@LnDCobra चलाने के लिए दृश्य स्टूडियो: अच्छा जवाब, +1। ध्यान दें कि आप आसानी से एक संलग्न संपत्ति है, जो itz हटा दिया हो रही एलान के तौर पर आइकन को हटाने, XAML –

+0

में सक्षम होगा के रूप में यह लागू हो सकता है मेरी समस्या exe फ़ाइल – shraddha

3

मैं WPF विंडो के लिए आइकन (1x1 px) के रूप में बहुत छोटी पारदर्शी छवि का उपयोग करता हूं।

1

बस यहजोड़ेंआपकी खिड़की के गुणों के लिए।

+0

खराब नहीं है। लेकिन यह बटन को अधिकतम/छोटा करता है –

संबंधित मुद्दे