2012-01-18 11 views
16

पर एकाधिक आइकन (Win32-Resource) जोड़ना प्रोजेक्ट गुणों में एप्लिकेशन-आइकन सेट करना संभव है। यदि आप ऐसा करते हैं तो एक्सई के पास डिफ़ॉल्ट आइकन के बजाय यह आइकन होगा। इस आइकन एक Win32-संसाधन है और यह भी इस तरह पहुँचा जा सकता है:.NET-Application

change icon

मैं फ़ाइल प्रकार जो मेरे प्रोग्राम के द्वारा उपयोग किया जाता है के लिए विशेष प्रतीक करना चाहते हैं। फ़ाइल टाइप-आइकन को संबद्ध करने के लिए मैं इसे रजिस्ट्री में निर्दिष्ट कर सकता हूं ("MyProg.exe, 1" "DefaultIcon" कुंजी में)।

तो असेंबली में अधिक आइकन जोड़ने के लिए कैसे मैं फ़ाइल टाइप-एसोसिएशन के लिए इसका उपयोग कर सकता हूं?

आपको बहुत बहुत

ps धन्यवाद: यह एक WPF-आवेदन (.NET 4.0)

उत्तर

15

विंडोज प्रबंधित संसाधनों के बारे में कुछ भी नहीं जानता है, तो आपको अपने निष्पादन योग्य अप्रबंधित संसाधनों को जोड़ने की आवश्यकता है। पैरापुरा के स्क्रीनशॉट में, आपको रेडियो बटन चुनने की आवश्यकता है। इसके लिए एक .res फ़ाइल की आवश्यकता होती है, एक बाइनरी फ़ाइल जिसे एक .rc फ़ाइल पर Windows SDK rc.exe उपकरण चलाकर बनाया गया है। ,

1 ICON "mainicon.ico" 
2 ICON "alternative1.ico" 
3 ICON "alternative2.ico" 
1 24 "app.manifest" 

बिना UTF-8 एन्कोडिंग अपनी परियोजना फ़ोल्डर में इस फाइल को बचाने के लिए सुनिश्चित का उपयोग कर नोटपैड सबसे अच्छा है: आर सी फ़ाइल एक साधारण पाठ फ़ाइल है कि संसाधन बयान, इस के समान होता है। प्रोजेक्ट + के साथ आवश्यक ऐप.मैनिफेस्ट फ़ाइल बनाएं + नया आइटम, एप्लिकेशन मैनिफेस्ट फ़ाइल जोड़ें। प्रोजेक्ट + मौजूदा आइटम जोड़ें के साथ अपनी परियोजना में यह .rc फ़ाइल जोड़ें। इसे डबल-क्लिक करें और सत्यापित करें कि आप आइकन और मैनिफेस्ट देख सकते हैं। शीर्ष नोड राइट-क्लिक करें, संसाधन जोड़ें और संस्करण + नया क्लिक करें। संस्करण जानकारी संपादित करें, सावधान रहना कि यह अब स्वचालित रूप से AssemblyInfo.cs में विशेषताओं से मेल खाएगी

आप में एक .res दृश्य स्टूडियो कमान शीघ्र साथ फाइल आर सी फ़ाइल संकलन कर सकते हैं:

rc /r something.rc 

कौन सा प्रोजेक्ट प्रॉपर्टी टैब में आप जिस .res फ़ाइल का उपयोग कर सकते हैं उसका उत्पादन करता है। ऐसा करने से प्री-बिल्ड इवेंट सलाह दी जाती है लेकिन सही होने में थोड़ा मुश्किल होता है। यह गलत तरीके से जा सकने वाले तरीकों की संख्या असंख्य, शुभकामनाएं हैं।

+0

समस्या हल है भूल गया। लेकिन मैंने आरसी/res-file बनाने के लिए [ResEdit] (http://www.resedit.net/) का उपयोग किया है। यह पूरी तरह से काम करता है – 0xDEADBEEF

+0

या सिर्फ एक देशी DLL कि आवेदन के साथ इस तरह के संसाधन शामिल होते तैनात है, तो आप कस्टम उपकरण चलाने के लिए या जानकारी वर्ज़निंग खोने के लिए नहीं है। –

+0

यह दृष्टिकोण फ़ाइल संस्करण जानकारी खो देता है, और आप इसे वापस बहाल (जैसे सी ++ संस्करण शैली आर सी फ़ाइल का उपयोग कर) यदि - आप अभी भी कार्य प्रबंधक/आवेदन शीर्षक गलत के साथ समस्या यह करना होगा। (अंत में अपना स्वयं का समाधान देखें और इसे अपडेट करें।) तो InsertIcons.exe का उपयोग करें! आधिकारिक माइक्रोसॉफ्ट उपकरण का उपयोग न करें! :-) – TarmoPikaro

0

है आप अपने प्रोजेक्ट सेटिंग पर जाएं, तो आप आवेदन के लिए आइकन निर्धारित करने के लिए एक तरह से देखेंगे।

enter image description here

अतिरिक्त आइकन को जोड़ने के लिए ...

    समाधान Explorer में प्रोजेक्ट पर
  • दायाँ माउस बटन और लेने नया आइटम और फिर संसाधन फ़ाइल
  • डबल संसाधन फ़ाइल क्लिक करें समाधान एक्सप्लोरर में और चुनें संसाधन जोड़ें -> नया आइकन
+0

मुझे पता है। मैंने पहले ही यह किया था। अगर मैं इसे संकलित करता हूं, तो exe का चयनित आइकन होता है। लेकिन कुछ और आइकन कैसे जोड़ें? – 0xDEADBEEF

+0

@ 0xDEADBEEF कृपया मेरे संपादन –

+2

काम नहीं करता है को देखने के (Resource1.resx जोड़ा, ico फ़ाइल और साफ + निर्माण समाधान भरी हुई)। एचएम, मैं उल्लेख करने के लिए (स्पष्ट) है कि मेरे प्रोग्राम एक WPF/.NET4-आवेदन – 0xDEADBEEF

8

मैंने अभी .res फ़ाइलों के साथ गड़बड़ किए बिना ऐसा करने के लिए एक सरल टूल बनाया है। यह एक छोटी उपयोगिता है जिसे आप अपने पोस्ट-बिल्ड इवेंट के हिस्से के रूप में उपयोग कर सकते हैं और आपको सभी आइकन फ़ाइलों को किसी विशेष फ़ोल्डर में अपनी असेंबली में जोड़ने देता है।अगर हम मान लें कि एक माउस अपने मुख्य परियोजना फ़ोल्डर के अंतर्गत फ़ोल्डर आप निम्नलिखित के बाद निर्माण घटना में जोड़ सकते हैं कि आपके पास:

C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons 

एक और विवरण और एक डाउनलोड http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

+0

ग्रेट टूल! हमारी जरूरतों के लिए पूरी तरह से काम किया। धन्यवाद! – CMerat

0

में पाया जा सकता जवाब के आधार पर जो मैं देखता हूं - यह काफी मामूली प्रतीत होता है, लेकिन दुर्भाग्यवश यह इतना आसान नहीं है।

.RC फ़ाइल से शुरू करते हैं - आप जल्दी से इस तरह फ़ाइल लिख सकते हैं: myown.rc:

1 ICON "..\\Folder1\\icon1.ico" 
2 ICON "..\\folder2\\icon2.ico" 
1 24 "myown.manifest" 

लेकिन अगले प्रश्न - जहां मैनिफ़ेस्ट फ़ाइल जो आप अपने आवेदन के लिए की जरूरत है पाने के लिए।

यह वर्तमान में इस्तेमाल किया मैनिफ़ेस्ट फ़ाइल को निकालने के लिए, इस तरह कमांड लाइन का उपयोग कर सकता है:

mt -inputresource:myOwnNetExe.exe;#1 -out:myown.manifest 

और फिर आप अपने .net निष्पादन के साथ कि प्रकट कर सकते हैं।

लेकिन यह सब कुछ नहीं है। प्रोजेक्ट से ही आप अपनी .res फ़ाइल के सापेक्ष पथ निर्दिष्ट नहीं कर सकते हैं, आप केवल पूर्ण पथ का उपयोग कर सकते हैं। .csproj को सहेजें, और इसे नोटपैड के साथ मैन्युअल रूप से संपादित करें - पथ को सापेक्ष बनाने के लिए। परियोजना उसके बाद बस ठीक है।

लेकिन svn/git में - आप शायद .res फ़ाइल - केवल स्रोत कोड नहीं डाल पाएंगे। .rc को .res को संकलित करने की आवश्यकता है।

प्रोजेक्ट/प्री-बिल्ड चरण में ऐसा करने के लिए सर्वश्रेष्ठ।

लेकिन निश्चित रूप से आरसीएक्सई लॉन्च नहीं किया जा सकता है, क्योंकि यह सी ++ प्रोजेक्ट है, और हमारे पास सी # प्रोजेक्ट है जो सी ++ प्रोजेक्ट पैथ की परवाह नहीं करता है।

यह इस तरह पूर्व निर्माण कदम का उपयोग कर walkarounded जा सकता है:

cd $(ProjectDir) 
call "%VS100COMNTOOLS%\vsvars32.bat" >nul 
rc /c 1252 /nologo myown.rc 

आप कहाँ दृश्य स्टूडियो जिसके साथ आप संकलित कर रहे हैं (मैं दृश्य स्टूडियो 2010 का उपयोग कर रहा है) के साथ VS100COMNTOOLS बदलने की जरूरत है।

और यह अभी भी सबकुछ नहीं है। रन-टाइम का - - आप तेज़ी से अपने आवेदन के आइकन को बदलना चाहते हैं आप कोड में रुचि हो सकती है इस तरह snipet:

[DllImport("shell32.dll")] 
public static extern IntPtr ExtractIcon(IntPtr hInst, string file, int nIconIndex); 

[DllImport("user32.dll", SetLastError = true)] 
static extern bool DestroyIcon(IntPtr hIcon); 

/// <summary> 
/// Sets icon from .exe or .dll into form object 
/// </summary> 
/// <param name="iIconIndex">Icon index to use.</param> 
/// <param name="form">Form to assign to given icon</param> 
/// <returns>true if ok, false if failed.</returns> 
bool SetIcon(object form, int iIconIndex, String dllOrExe = null) 
{ 
    if(dllOrExe == null) 
     dllOrExe = System.Reflection.Assembly.GetExecutingAssembly().Location; 

    IntPtr hIcon = ExtractIcon(IntPtr.Zero, dllOrExe, iIconIndex); 

    if(hIcon == IntPtr.Zero) 
     return false; 

    Icon icon = (Icon) Icon.FromHandle(hIcon).Clone(); 
    DestroyIcon(hIcon); 

    form.GetType().GetProperty("Icon").SetValue(form, icon); 
    return true; 
} 

कहाँ Form_Load में आप इस तरह कॉल कर सकते हैं:

SetIcon(this, N); 

जहां पहले आइकन के लिए एन = 0, एन = 1 - दूसरे के लिए और इसी तरह।

18.5.2016 अद्यतन मेरा दृष्टिकोण ठीक काम करता है - हालांकि - इस असेंबली फ़ाइल गुणों के बाद - संस्करण जानकारी गायब हो जाती है। सामान्य C++ .rc फ़ाइल का उपयोग करके इसे वापस पुनर्स्थापित करना संभव है, लेकिन दुर्भाग्य से मेरे लिए यह असेंबली विशेषताओं को तोड़ देता है - कार्य प्रबंधक आपके exe को "एप्लिकेशन" के रूप में प्रदर्शित करेगा। अगर किसी भी तरह से प्रकट/एप्लिकेशन शीर्षक को बदलना संभव है तो मैंने थोड़ा गहराई से कटाई करने की कोशिश की है - लेकिन बिना किसी परिणाम के। इसके बाद मैं यहां प्रस्तावित InsertIcons.exe समाधान का उपयोग करके समाप्त हो गया हूं।

तो अगर आप फ़ाइल संस्करण जानकारी में रुचि नहीं कर रहे हैं - InsertIcons.exe का उपयोग करें - आप फ़ाइल संस्करण और कार्य प्रबंधक की जरूरत है अपने आवेदन सही ढंग से दिखाना चाहिए आप, मेरे समाधान का उपयोग कर सकते हैं। सी # कोड स्निपेट (SetIcon) यहां किसी भी समाधान में आपके लिए काम करेगा।

0

मैं InsertIcons सफलतापूर्वक दृष्टिकोण जब तक सिमेंटेक एंटी वायरस संदिग्ध के रूप में मेरे exe अप ​​पर चिह्नित करने शुरू कर दिया करते थे। मेरा अनुमान है कि सिमेंटेक को हस्ताक्षर में बदलाव पसंद नहीं आया जो कि पोस्ट बिल्ड चरण के रूप में exe के साथ गड़बड़ के साथ आता है।

अंत मैं एक अलग नेट dll वर्ग csproj फ़ाइल में निम्न कोड का उपयोग कर संकलित पुस्तकालय के साथ चला गया में:

<PropertyGroup> 
    <Win32Resource>icons.res</Win32Resource> 
</PropertyGroup> 

आप सी ++ स्थापित उपकरणों का निर्माण करने की आवश्यकता नहीं है, लेकिन आप की क्या ज़रूरत है उपरोक्त स्वीकृत उत्तर में वर्णित संसाधन संकलक।

मेरे icons.rc फ़ाइल इस तरह दिखता है:

1 ICON "IconA.ico" 
2 ICON "IconB.ico" 
3 ICON "IconC.ico" 

और पूर्व निर्माण आदेश है:

"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe" $(ProjectDir)icons.rc