2012-01-18 30 views
16

có thể đặt Biểu tượng ứng dụng trong Thuộc tính dự án. Nếu bạn làm điều này, exe sẽ có biểu tượng này thay vì biểu tượng mặc định. biểu tượng này là một win32-tài nguyên và cũng có thể được truy cập như thế này:Thêm nhiều biểu tượng (Win32-Resource) vào .NET-Application

change icon

tôi muốn có các biểu tượng đặc biệt cho các loại file được sử dụng bởi chương trình của tôi. để liên kết một biểu tượng filetype-i có thể chỉ định nó trong sổ đăng ký ("MyProg.exe, 1" trong khóa "DefaultIcon").

vì vậy cách THÊM biểu tượng THÊM cho hội đồng mà tôi có thể sử dụng nó cho hiệp hội loại tệp?

thank you very much

ps: nó là một WPF-Ứng dụng (.NET 4.0)

Trả lời

15

Windows không biết bất kỳ điều gì về tài nguyên được quản lý, bạn cần thêm tài nguyên không được quản lý vào tệp thi hành của mình. Trong ảnh chụp màn hình của parapura, bạn cần chọn nút radio . Yêu cầu tệp .res, tệp nhị phân được tạo bằng cách chạy công cụ rc.exe của Windows SDK trên tệp .rc. Các tập tin rc là một tập tin văn bản đơn giản có chứa báo cáo tài nguyên, tương tự như sau:

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

Hãy chắc chắn để lưu file này vào thư mục dự án của bạn mà không utf-8 mã hóa, sử dụng Notepad là tốt nhất. Tạo tệp app.manifest bắt buộc với Dự án + Thêm mục mới, Tệp kê khai ứng dụng. Thêm tệp .rc này vào dự án của bạn với Project + Add Existing Item. Bấm đúp vào nó và xác minh rằng bạn có thể thấy các biểu tượng và tệp kê khai. Nhấp chuột phải vào nút trên cùng, Thêm tài nguyên và nhấp vào Phiên bản + Mới. Chỉnh sửa thông tin phiên bản, hãy cẩn thận rằng nó sẽ không còn tự động phù hợp với các thuộc tính trong AssemblyInfo.cs

Bạn có thể biên dịch các tập tin rc vào nộp res với Visual Studio Cửa sổ nhắc lệnh:

rc /r something.rc 

nào tạo tệp .res bạn có thể sử dụng trong tab thuộc tính dự án. Làm điều này là một sự kiện dựng sẵn được khuyến khích nhưng hơi khó để có được quyền. Số lượng các cách này có thể đi sai rất nhiều, chúc may mắn.

+0

được giải quyết. nhưng tôi đã sử dụng [ResEdit] (http://www.resedit.net/) để tạo tập tin rc/res. nó hoạt động hoàn hảo – 0xDEADBEEF

+0

Hoặc chỉ triển khai một DLL gốc có chứa các tài nguyên như vậy với ứng dụng, do đó bạn không phải chạy các công cụ tùy chỉnh hoặc mất thông tin phiên bản. –

+0

Cách tiếp cận này sẽ mất thông tin về phiên bản tệp và nếu bạn khôi phục lại thông tin đó (ví dụ: sử dụng tệp .rc kiểu phiên bản .rc) - bạn vẫn gặp sự cố với trình quản lý tác vụ/tiêu đề ứng dụng không chính xác. (Xem giải pháp của riêng tôi và cập nhật cho nó ở cuối.) Vì vậy, sử dụng InsertIcons.exe! Không sử dụng các công cụ chính thức của Microsoft! :-) – TarmoPikaro

0

Nếu bạn đi đến thiết lập dự án của bạn, bạn sẽ thấy một cách để đặt biểu tượng cho ứng dụng.

enter image description here

Để thêm biểu tượng bổ sung ...

  • Ngay Chuột Nút trên dự án trong Solution Explorer và chọn New Item và sau đó Tài tập
  • Nhấn đúp chuột vào tập tin nguồn trong trình khám phá giải pháp và chọn Thêm tài nguyên -> Biểu tượng mới
+0

tôi biết. tôi đã làm điều này rồi. nếu tôi biên dịch này, exe có biểu tượng được chọn. nhưng làm cách nào để thêm một số biểu tượng nữa? – 0xDEADBEEF

+0

@ 0xDEADBEEF vui lòng xem chỉnh sửa của tôi –

+2

không hoạt động (thêm Resource1.resx, tải tệp ico và giải pháp xây dựng sạch). hm, tôi quên đề cập đến (rõ ràng) rằng chương trình của tôi là một vấn đề WPF/.NET4-Application – 0xDEADBEEF

8

Tôi vừa tạo một công cụ đơn giản để thực hiện chính xác điều này mà không phải gây rối với các tệp .res. Nó là một tiện ích nhỏ mà bạn có thể sử dụng như một phần của sự kiện Post-Build của bạn và cho phép bạn thêm tất cả các tệp biểu tượng trong một thư mục cụ thể vào assembly của bạn.Nếu chúng ta giả định rằng bạn có một biểu tượng thư mục trong thư mục chính của dự án của bạn, bạn có thể thêm các hậu xây dựng sự kiện sau đây:

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

Mô tả thêm và tải về có thể được tìm thấy tại http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

+0

Công cụ tuyệt vời! Làm việc hoàn hảo cho nhu cầu của chúng tôi. Cảm ơn! – CMerat

0

Dựa trên câu trả lời mà Tôi hiểu - nó có vẻ khá tầm thường, nhưng tiếc là nó không đơn giản như vậy.

Hãy bắt đầu từ file rc - bạn có thể nhanh chóng ghi file như thế này: myown.rc:

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

Nhưng câu hỏi tiếp theo - nơi để có được file manifest mà bạn cần cho ứng dụng của bạn.

Có thể trích xuất đang được sử dụng file manifest, sử dụng dòng lệnh như thế này:

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

Và sau đó bạn có thể sử dụng manifest với thực thi .net bạn.

Nhưng đây không phải là tất cả. Từ bản thân dự án bạn không thể chỉ định đường dẫn tương đối vào tệp .res của bạn, bạn chỉ có thể sử dụng đường dẫn tuyệt đối. Lưu .csproj và chỉnh sửa thủ công bằng notepad - để tạo đường dẫn tương đối. Dự án biên dịch tốt sau đó.

Nhưng vào svn/git - có thể bạn sẽ không đặt tệp .res - chỉ là mã nguồn. Cần biên dịch .rc thành .res.

Làm tốt nhất trong bước dự án/xây dựng trước.

Nhưng dĩ nhiên rc.exe không thể khởi chạy, vì nó là dự án C++ và chúng tôi có dự án C# không quan tâm đến đường dẫn dự án C++.

này có thể được sử dụng walkarounded pre-build bước như thế này:

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

Trong trường hợp bạn cần phải thay đổi VS100COMNTOOLS với visual studio mà bạn đang biên soạn (Tôi đang sử dụng Visual studio 2010).

Và điều này vẫn không phải là tất cả. Nếu bạn muốn thay đổi biểu tượng của ứng dụng của bạn trên bay - trong thời gian chạy - bạn có thể quan tâm trong mã snipet như thế này:

[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; 
} 

đâu trong Form_Load bạn có thể thực hiện cuộc gọi như thế này:

SetIcon(this, N); 

Trong đó N = 0 cho biểu tượng đầu tiên, N = 1 - cho giây và cứ tiếp tục như vậy.

18.5.2016 Cập nhật Cách tiếp cận của tôi hoạt động ok - tuy nhiên - sau khi thông tin phiên bản tệp lắp ráp này biến mất. Nó có thể khôi phục lại nó bằng cách sử dụng điển hình C + + .rc tập tin, nhưng tiếc là đối với tôi nó sau đó phá vỡ các thuộc tính lắp ráp bằng cách nào đó - công việc quản lý sẽ hiển thị exe của bạn là "Ứng dụng". Tôi đã cố gắng thu hoạch sâu hơn một chút nếu có thể bằng cách nào đó thay đổi tiêu đề ứng dụng/biểu hiện - nhưng không có kết quả nào. Sau đó tôi đã kết thúc bằng cách sử dụng giải pháp InsertIcons.exe được đề xuất ở đây là tốt.Vì vậy, nếu bạn không quan tâm đến thông tin phiên bản tệp - bạn có thể sử dụng giải pháp của mình, nếu bạn cần phiên bản tệp và trình quản lý tác vụ sẽ hiển thị ứng dụng của bạn một cách chính xác - hãy sử dụng InsertIcons.exe. C# mã snipet (SetIcon) ở đây sẽ làm việc cho bạn trong bất kỳ giải pháp nào.

0

Tôi đã sử dụng phương pháp tiếp cận InsertIcons thành công cho đến khi vi-rút chống vi-rút của Symantec bắt đầu gắn cờ phần mềm exe của tôi là đáng ngờ. Đoán của tôi là Symantec không thích sự thay đổi trong chữ ký mà đi kèm với rối tung về với exe như là một bước xây dựng bài.

Cuối cùng tôi đã đi với một riêng biệt NET thư viện lớp dll biên soạn bằng cách sử dụng đoạn mã sau vào file csproj:

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

Bạn không cần phải có C++ xây dựng các công cụ được cài đặt, nhưng bạn cần trình biên dịch tài nguyên như được mô tả trong câu trả lời được chấp nhận ở trên.

tập tin icons.rc của tôi trông như thế này:

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

Và trước khi xây dựng lệnh là:

"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe" $(ProjectDir)icons.rc 
Các vấn đề liên quan