OSDN Git Service

AppliStation-GUI,Windows7でシールドアイコンが4色になってしまうのを修正
authorttp <ttp@users.sourceforge.jp>
Sun, 25 Oct 2009 06:13:12 +0000 (15:13 +0900)
committerttp <ttp@users.sourceforge.jp>
Sun, 25 Oct 2009 06:13:12 +0000 (15:13 +0900)
Vista以降はシステムのシールドアイコンを呼び出すよう変更。
XP以前はSystemIconで代用する(従来のアイコンリソースは削除)。

AppliStation/AppliStation.Util/GUIUtils.cs
AppliStation/AppliStation.Util/NativeMethods.cs
AppliStation/InstallationConfirmForm.Designer.cs
AppliStation/InstallationConfirmForm.cs
AppliStation/InstallationConfirmForm.resx
AppliStation/PackageUninstallConfirmForm.Designer.cs
AppliStation/PackageUninstallConfirmForm.cs
AppliStation/PackageUninstallConfirmForm.resx

index 7cc2c16..9403dfe 100644 (file)
@@ -18,44 +18,6 @@ namespace AppliStation.Util
                \r
                #region ExtraIcon関連\r
                \r
-               [DllImport("shell32.dll")]\r
-               private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);\r
-               \r
-               [DllImport("user32.dll", SetLastError=true)]\r
-               [return: MarshalAs(UnmanagedType.Bool)]\r
-               private static extern bool DestroyIcon(IntPtr hIcon);\r
-               \r
-               /// <summary>\r
-               /// アイコンファイル(実行ファイル・DLL)を開いてアイコンを作る\r
-               /// </summary>\r
-               /// <remarks>内部でコピーされるのでWin32APIのDestroyIconを使わないでいいが、やや遅い動作</remarks>\r
-               /// <param name="form">ハンドラ</param>\r
-               /// <param name="lpszExeFileName">対象ファイル</param>\r
-               /// <param name="nIconIndex">アイコンインデックス</param>\r
-               /// <returns>生成されたアイコン</returns>\r
-               public static Icon ExtractIcon(Form form, string lpszExeFileName, uint nIconIndex)\r
-               {\r
-                       Icon ico = null;\r
-                       \r
-                       if (! File.Exists(lpszExeFileName)) {\r
-                               ico = Icon.ExtractAssociatedIcon(lpszExeFileName); // ExtractAssociatedIconに例外を吐いてもらう\r
-                       } else {\r
-                               IntPtr hInst = (form != null)? form.Handle : IntPtr.Zero;\r
-                               IntPtr hIcon = IntPtr.Zero;\r
-                               \r
-                               try {\r
-                                       hIcon = ExtractIcon(hInst, lpszExeFileName, (int) nIconIndex);\r
-                                       if ((hIcon != IntPtr.Zero) && (hIcon.ToInt32() != 2)) {\r
-                                               ico = (Icon) Icon.FromHandle(hIcon).Clone();\r
-                                               DestroyIcon(hIcon);\r
-                                       }\r
-                               } catch (System.Runtime.InteropServices.COMException) {\r
-                                       // ExtraIconのP/Invoke失敗時用\r
-                               }\r
-                       }\r
-                       return ico;\r
-               }\r
-               \r
                /// <summary>\r
                /// アイコンファイル(実行ファイル・DLL)を開いてアイコンを作る\r
                /// </summary>\r
@@ -67,7 +29,7 @@ namespace AppliStation.Util
                        int index = lpszExeFileNameAndIndex.LastIndexOf(',');\r
                        if (index >= 0) {\r
                                uint nIconIndex = uint.Parse(lpszExeFileNameAndIndex.Substring(index+1));\r
-                               return ExtractIcon(form, lpszExeFileNameAndIndex.Substring(0, index), nIconIndex);\r
+                               return NativeMethods.ExtractIcon(form, lpszExeFileNameAndIndex.Substring(0, index), nIconIndex);\r
                        } else {\r
                                return Icon.ExtractAssociatedIcon(lpszExeFileNameAndIndex);\r
                        }\r
@@ -81,7 +43,7 @@ namespace AppliStation.Util
                {\r
                        // Vista以降ならば、SHGetStockIconInfo(SIID_FOLDER, SHGSI_ICON, &sInfo); をP/Invoke呼び出しするのが王道かと\r
                        string windir = Environment.GetEnvironmentVariable("windir");\r
-                       return ExtractIcon(null, Path.Combine(windir, @"system32\shell32.dll"), 3);\r
+                       return NativeMethods.ExtractIcon(null, Path.Combine(windir, @"system32\shell32.dll"), 3);\r
                }\r
                \r
                #endregion\r
@@ -165,7 +127,7 @@ namespace AppliStation.Util
                                    0, 0, img.Width, img.Height,\r
                                    GraphicsUnit.Pixel, ia);\r
                }\r
-\r
+               \r
                #endregion\r
                \r
                #region CheckedListBox関連\r
index 0065897..5a5d015 100644 (file)
@@ -4,6 +4,7 @@
 using System;\r
 using System.Runtime.InteropServices;\r
 using System.Windows.Forms;\r
+using System.Drawing;\r
 \r
 namespace AppliStation.Util\r
 {\r
@@ -316,6 +317,75 @@ namespace AppliStation.Util
                \r
                #endregion\r
                \r
+               #region アイコン関連\r
+               \r
+               [DllImport("shell32.dll")]\r
+               private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);\r
+               \r
+               [DllImport("user32.dll", SetLastError=true)]\r
+               [return: MarshalAs(UnmanagedType.Bool)]\r
+               private static extern bool DestroyIcon(IntPtr hIcon);\r
+               \r
+               \r
+               /// <summary>\r
+               /// アイコンファイル(実行ファイル・DLL)を開いてアイコンを作る\r
+               /// </summary>\r
+               /// <remarks>内部でコピーされるのでWin32APIのDestroyIconを使わないでいいが、やや遅い動作</remarks>\r
+               /// <param name="form">ハンドラ</param>\r
+               /// <param name="lpszExeFileName">対象ファイル</param>\r
+               /// <param name="nIconIndex">アイコンインデックス</param>\r
+               /// <returns>生成されたアイコン</returns>\r
+               public static Icon ExtractIcon(Form form, string lpszExeFileName, uint nIconIndex)\r
+               {\r
+                       Icon ico = null;\r
+                       \r
+                       if (! System.IO.File.Exists(lpszExeFileName)) {\r
+                               ico = Icon.ExtractAssociatedIcon(lpszExeFileName); // ExtractAssociatedIconに例外を吐いてもらう\r
+                       } else {\r
+                               IntPtr hInst = (form != null)? form.Handle : IntPtr.Zero;\r
+                               IntPtr hIcon = IntPtr.Zero;\r
+                               \r
+                               try {\r
+                                       hIcon = ExtractIcon(hInst, lpszExeFileName, (int) nIconIndex);\r
+                                       if ((hIcon != IntPtr.Zero) && (hIcon.ToInt32() != 2)) {\r
+                                               ico = (Icon) Icon.FromHandle(hIcon).Clone();\r
+                                               DestroyIcon(hIcon);\r
+                                       }\r
+                               } catch (System.Runtime.InteropServices.COMException) {\r
+                                       // ExtraIconのP/Invoke失敗時用\r
+                               }\r
+                       }\r
+                       return ico;\r
+               }\r
+               \r
+               /// <summary>\r
+               /// ユーザ昇格が必要か設定し、設定必要なときシールドアイコンを表示する。\r
+               /// </summary>\r
+               /// <param name="button">対象のボタン</param>\r
+               /// <param name="required">ユーザ昇格が必要か否か、すなわちシールドアイコンを表示するか</param>           \r
+               public static void Button_SetElevationRequiredState(Button button, bool required)\r
+               {\r
+                       if (Environment.OSVersion.Version.Major >= 6) {\r
+                               button.FlatStyle = FlatStyle.System;\r
+                               // SendMessage(hWnd, BCM_SETSHIELD, 0, required);\r
+                               SendMessage(button.Handle, 0x160C, 0, (required)? 1u : 0u);\r
+                       } else { // Legacy OS\r
+                               // FlatStyle.System に設定されている場合、Image プロパティに割り当てられているイメージは表示されない対策\r
+                               if (button.FlatStyle == FlatStyle.System) {\r
+                                       button.FlatStyle = FlatStyle.Standard;\r
+                               }\r
+                               \r
+                               button.TextImageRelation = TextImageRelation.ImageBeforeText;\r
+                               button.ImageAlign = ContentAlignment.MiddleLeft;\r
+                               using (Icon ico = new Icon(SystemIcons.Shield, 16, 16)) {\r
+                                       button.Image = ico.ToBitmap();\r
+                               }\r
+                               button.AutoSize = true;\r
+                       }\r
+               }\r
+               \r
+               #endregion\r
+               \r
                [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
                internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);\r
                \r
index 4ddfaf7..5ac57e1 100644 (file)
@@ -104,13 +104,11 @@ namespace AppliStation
                        // \r
                        this.okButton.AutoSize = true;\r
                        this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;\r
-                       this.okButton.Image = ((System.Drawing.Image)(resources.GetObject("okButton.Image")));\r
                        this.okButton.Location = new System.Drawing.Point(135, 3);\r
                        this.okButton.Name = "okButton";\r
                        this.okButton.Size = new System.Drawing.Size(86, 23);\r
                        this.okButton.TabIndex = 0;\r
                        this.okButton.Text = "インストール";\r
-                       this.okButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
                        // \r
                        // cancelButton\r
                        // \r
index 3b7ed56..2f817e3 100644 (file)
@@ -392,12 +392,7 @@ namespace AppliStation
                \r
                private void updateUseRunas()\r
                {\r
-                       if (UseRunas) {\r
-                               System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InstallationConfirmForm));\r
-                               okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));\r
-                       } else {\r
-                               okButton.Image = null;\r
-                       }\r
+                       AppliStation.Util.NativeMethods.Button_SetElevationRequiredState(okButton, UseRunas);\r
                }\r
                \r
                #endregion\r
index 201fa42..cb0098e 100644 (file)
   <resheader name="writer">\r
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </resheader>\r
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="okButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAApdJREFUOE+Fk21I\r
-        k1EUx61vgRX0wYqc4mi+JOqoD4WV9oJKpC5fM6m1QKdJEpVCTZFCmpl92FaNEicJlWUffGtEy2eS5sbQ\r
-        9mIlFRWIIk60TZuYpPt37mgy6QEf+MPl3P/53XPPc+66IJ5PqVRGBwcHv/B6vSLaXk/fiMfjSVMoFE4+\r
-        /0qMEqNaWlpadTrdvNFohM1m84mtGxsbPbTXRp7I/yAULFSr1d9UKpXHZDKBafnDEJaeNaPpkQzlHfmw\r
-        WCy+OHnmNRqNneUEnjxhtVq97DT342YsDvRg8XU7FjQ3Uf8wAyVdWSh6KkGe5qivIvKCAO5AwIzdbseP\r
-        qmuYuV2Dn1olZq9XwC3Nw+VbeyF5nozM5v1IvbMb+xRRPggB5lYBWHD0ghyTFcWYKMrBZOIeOAUCyKp3\r
-        IuZBBBJUYRDf2AFh+WZewDSrYKr0NGZl6ZiKDYUrKAi/SKcUEdhyPxzRd0VIaBAhrHIbL2DM4XDgo7QQ\r
-        X9KOwBqyHcMbt+JzaCTOV+3CwdZ4HH8ihkSXgCRlmB8wFniFDqrAmyVrQsGZe8jMrcehjAak5KvRbZDD\r
-        8TURw58OY3goGe9fRsFsNi9TD14FAmoMBsOfpKscQuRGhF7isKGkB5vK3qCvrxxwpwLOE8BoOtAXC71e\r
-        P0OA2hVAXV1djFarHWeNFEk7ESfvRPi5TgiLu2B5R4CpY8B4LjBC16NfSN7vBBCuGigK2FgjcyrbIDrb\r
-        jQhpF4RFepj6CeDMBsYkcA0c8M+AgW8aBQRxsSqyq/SIL+MgvshhoP8K4CrF3EiBv3nT5BPwvgnaOEn6\r
-        zSBsbFNqzRgcrPat/w3PIvOs9aAYZKG3t3flMXEcxyZvYc1kP5mMcSQzaYnEkt+SYvhO/gusfu3mrz6d\r
-        pwAAAABJRU5ErkJggg==\r
-</value>\r
-  </data>\r
-  <metadata name="instListViewContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>17, 17</value>\r
-  </metadata>\r
-  <metadata name="instListViewSilentInstallImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>225, 17</value>\r
-  </metadata>\r
   <data name="instListViewSilentInstallImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">\r
     <value>\r
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w\r
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACo\r
-        BAAAAk1TRnQBSQFMAwEBAAEEAQABBAEAAQ4BAAEOAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABOAMA\r
+        BAAAAk1TRnQBSQFMAwEBAAEEAQABBAEAAQ4BAAEOAQAE/wEhARAI/wFCAU0BNgcAATYDAAEoAwABOAMA\r
         AQ4DAAEBAQABIAUAAUABDB4AAwIBAwMSARkBIgIhATEDLAFEAVwCUAGwAXkBPAFRAekBewE9AU8B6AF6\r
         AUEBTAHkAXkBQwFNAeIBfAFDAU8B4wFVAk4BobAAAw4BEwFRAkwBlgFlAlABwgF1AU0BSgHWAXkCSAHc\r
         AVYBIgGQAfsCRAHxAf8CUQHyAf8CJAHvAf8CRgHyAf8CTQHyAf8BfAFDAU8B46wAAwEBAgFbAlEBrQGd\r
         AYUBxAHtAf8BeAHAAewB/wFRAa4B5gH/ATEBnwHhAf8BQwJBAXXDAAEBAWQCUQG+AUcBqQHlAf8BUgGv\r
         AeYB/wFOAawB5QH/AT4BpQHjAf8BbgJRAc4DBgEIxAADCgENAVMCTAGaAXACUAHQAXICTwHUAVUCTgGh\r
         AxEBF7gAAUIBTQE+BwABPgMAASgDAAE4AwABDgMAAQEBAAEBBQABcBcAA/8BAAHgBwABwAcAAYAHAAGA\r
-        BwABgAcAAYAHAAHABwABwAEMBgAB4AEcBgAB4AEcBgAB4AEcBgAB4AEcBgAB4AEcBgAB8AE8BgAL\r
+        BwABgAcAAYAHAAHABwABwAEMBgAB4AEcBgAB4AEcBgAB4AEcBgAB4AEcBgAB4AEcBgAB8AE8HAAL\r
 </value>\r
   </data>\r
+  <metadata name="instListViewContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>17, 17</value>\r
+  </metadata>\r
+  <metadata name="instListViewSilentInstallImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>225, 17</value>\r
+  </metadata>\r
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
     <value>45</value>\r
   </metadata>\r
index ca31515..f666976 100644 (file)
@@ -102,13 +102,11 @@ namespace AppliStation
                        // \r
                        this.okButton.AutoSize = true;\r
                        this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;\r
-                       this.okButton.Image = ((System.Drawing.Image)(resources.GetObject("okButton.Image")));\r
                        this.okButton.Location = new System.Drawing.Point(135, 3);\r
                        this.okButton.Name = "okButton";\r
                        this.okButton.Size = new System.Drawing.Size(104, 23);\r
                        this.okButton.TabIndex = 0;\r
                        this.okButton.Text = "アンインストール";\r
-                       this.okButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
                        // \r
                        // cancelButton\r
                        // \r
index 4c7621b..1abc56e 100644 (file)
@@ -81,12 +81,7 @@ namespace AppliStation
                \r
                private void updateUseRunas()\r
                {\r
-                       if (UseRunas) {\r
-                               System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InstallationConfirmForm));\r
-                               okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));\r
-                       } else {\r
-                               okButton.Image = null;\r
-                       }\r
+                       AppliStation.Util.NativeMethods.Button_SetElevationRequiredState(okButton, UseRunas);\r
                }\r
                \r
                #endregion\r
index 6c99de1..5ea0895 100644 (file)
   <resheader name="writer">\r
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </resheader>\r
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="okButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAApdJREFUOE+Fk21I\r
-        k1EUx61vgRX0wYqc4mi+JOqoD4WV9oJKpC5fM6m1QKdJEpVCTZFCmpl92FaNEicJlWUffGtEy2eS5sbQ\r
-        9mIlFRWIIk60TZuYpPt37mgy6QEf+MPl3P/53XPPc+66IJ5PqVRGBwcHv/B6vSLaXk/fiMfjSVMoFE4+\r
-        /0qMEqNaWlpadTrdvNFohM1m84mtGxsbPbTXRp7I/yAULFSr1d9UKpXHZDKBafnDEJaeNaPpkQzlHfmw\r
-        WCy+OHnmNRqNneUEnjxhtVq97DT342YsDvRg8XU7FjQ3Uf8wAyVdWSh6KkGe5qivIvKCAO5AwIzdbseP\r
-        qmuYuV2Dn1olZq9XwC3Nw+VbeyF5nozM5v1IvbMb+xRRPggB5lYBWHD0ghyTFcWYKMrBZOIeOAUCyKp3\r
-        IuZBBBJUYRDf2AFh+WZewDSrYKr0NGZl6ZiKDYUrKAi/SKcUEdhyPxzRd0VIaBAhrHIbL2DM4XDgo7QQ\r
-        X9KOwBqyHcMbt+JzaCTOV+3CwdZ4HH8ihkSXgCRlmB8wFniFDqrAmyVrQsGZe8jMrcehjAak5KvRbZDD\r
-        8TURw58OY3goGe9fRsFsNi9TD14FAmoMBsOfpKscQuRGhF7isKGkB5vK3qCvrxxwpwLOE8BoOtAXC71e\r
-        P0OA2hVAXV1djFarHWeNFEk7ESfvRPi5TgiLu2B5R4CpY8B4LjBC16NfSN7vBBCuGigK2FgjcyrbIDrb\r
-        jQhpF4RFepj6CeDMBsYkcA0c8M+AgW8aBQRxsSqyq/SIL+MgvshhoP8K4CrF3EiBv3nT5BPwvgnaOEn6\r
-        zSBsbFNqzRgcrPat/w3PIvOs9aAYZKG3t3flMXEcxyZvYc1kP5mMcSQzaYnEkt+SYvhO/gusfu3mrz6d\r
-        pwAAAABJRU5ErkJggg==\r
-</value>\r
-  </data>\r
 </root>
\ No newline at end of file