EDIT1:編輯標題- C#,WPF - 添加圖標之後項目的大小(負荷圖標從資源或從項目EXE拉)
EDIT2:添加方法3
EDIT3:添加方法4
我正在創建一個總共只有20KB的非常小的應用程序/實用程序。我包含各種大小的圖標文件是40KB。
我加入我的圖標的方式是通過右鍵單擊我的項目在解決方案資源管理,然後單擊「現有項...」,然後我會再次右鍵單擊我的項目,選擇「屬性」 - >「應用程序「並在」圖標和清單「下爲我的整個項目選擇我的新圖標。
這樣做顯示我的圖標在我的所有表格,exe文件,任務欄等...除了系統托盤圖標。
我加載系統托盤圖標的方式是通過從EXE中提取圖標:
方法1:
Icon ico = System.Drawing.Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
notifyIcon.Icon = ico;
現在我總項目規模與加載的所有我的圖標是20KB + 40KB = 60KB < - 這就是我所追求的。
我想知道這是加載我所有圖標的正確方法嗎?
我知道我可以在項目中添加我的圖標「資源」,並做到:
方法2:
notifyIcon.Icon = PROJECTNAME.Properties.Resources.icon;
但是,這只是雙打的圖標大小,然後添加項目規模在上面。所以:
20KB(項目規模)+ 40KB(EXE圖標)+ 40KB(資源圖標)= 100KB
方法3
「不和諧」 已張貼在回答下面的另一種方式搶該文件直接來自可執行資源。
IntPtr hIcon = LoadIcon(GetModuleHandle(null), new IntPtr(32512));
notifyIcon.Icon = Icon.FromHandle(hIcon);
[DllImport("user32.dll")]
static extern IntPtr LoadIcon (IntPtr hInstance, IntPtr iconName);
[DllImport("kernel32.dll")]
static extern IntPtr GetModuleHandle (string moduleName);
與方法1和方法3唯一的問題現在的問題是,在32×32,然後將圖標提取縮小到16×16不看好在系統托盤中。
這個答案在這裏通過「vanmelle」:Avoiding duplicate icon resources in a .NET (C#) project介紹如何獲取該圖標的16×16,但不知道這是否會得到HiDPI分辨率32×32的版本
方法4
提取圖標從項目EXE似乎要麼做16x16或32x32取決於使用的代碼。無法做到這一點,並讓操作系統選擇希望用於HiDPI系統的操作系統。不幸的是我創建另一個圖標文件,只有我的應用程序圖標的16x16和32x32版本,然後像這樣使用它:(幸運的是我的16x16,32x32應用程序圖標只有4KB)
notifyIcon.Icon = new System.Drawing.Icon(Properties.Resources.ico, System.Windows.Forms.SystemInformation.SmallIconSize);
如果需要,此方法將調用16x16圖標或32x32圖標。
你可以這樣做:
notifyIcon.Icon = new System.Drawing.ico;
但這總是會調用32x32的圖標,它縮小到16×16可以不看在系統托盤好。
起初,我所採取的方式是添加圖標,「資源」,並有NotifyIcon的從那裏調用它。然後在解決方案資源管理器 - 項目名稱 - >「屬性」 - >「應用程序」我會選擇那裏的項目圖標。這會加載我的圖標大小兩次,使我的項目從(20KB + 40KB圖標)跳到100KB
目前,我正在使用方法1.我想知道是否有更好的方式來加載我的圖標並保持我的應用程序大小而不是兩次添加圖標大小?
雖然我明白60KB和100KB之間的差異並不是什麼大不了的事情,但我只是想爲將來的參考學習這一點。此外,想知道我的第一個方法是否有任何警告?
我來自網絡開發背景,對C#和WPF來說都很新穎。
非常感謝您的例子和鏈接。這無疑幫助了我,並增加了更多完成我需要的方法。我知道你的意思是「雖然可能有一些問題」。從EXE中拉出圖標只能獲得32x32的系統托盤圖標,並將其縮小到16x16,這看起來不如僅抓取圖標的16x16版本。我仍然試圖找到一種方式。 – hyperexpert
@hyperexpert嘗試[LoadImage](https://msdn.microsoft.com/library/windows/desktop/ms648045.aspx)。 – Athari