OSDN Git Service

AppliStation-GUI,OptionDialogについてノート付きコマンドリンク形式に変更。
[applistation/AppliStation.git] / AppliStation / AppliStation.Util / NativeMethods.cs
index 8f091db..14fc235 100644 (file)
+// Vistaの効果を有効にするフラグ(不要の場合はコメントアウト)\r
+#define USE_VISTA_EFFECTS\r
+\r
+// Sevenの効果を有効にするフラグ(不要の場合はコメントアウト)\r
+#define USE_SEVEN_EFFECTS\r
+\r
 using System;\r
 using System.Runtime.InteropServices;\r
 using System.Windows.Forms;\r
+using System.Drawing;\r
 \r
 namespace AppliStation.Util\r
 {\r
+       /// <summary>\r
+       /// Win32ネイティブメソッドを叩いてGUI操作するための関数群のクラス\r
+       /// </summary>\r
        public sealed class NativeMethods\r
        {\r
+               /// <summary>\r
+               /// 呼び出し禁止\r
+               /// </summary>\r
                private NativeMethods()\r
                {\r
                }\r
+\r
+               #region 進捗の表示\r
                \r
+               /// <summary>\r
+               /// プログレスバーステータス(色)\r
+               /// </summary>\r
+               public enum ProgressBarState\r
+               {\r
+                       /// <summary>\r
+                       /// 通常の状態(PBST_NORMAL)。デフォルトの設定では緑色。\r
+                       /// </summary>\r
+                       Normal = 0,\r
+                       /// <summary>\r
+                       /// エラーの状態(PBST_ERROR)。デフォルトの設定では赤色。\r
+                       /// </summary>\r
+                       Error = 1,\r
+                       /// <summary>\r
+                       /// 停止の状態(PBST_PAUSED)。デフォルトの設定では黄色。\r
+                       /// </summary>\r
+                       Paused = 2,\r
+               }\r
                \r
                /// <summary>\r
-               /// WindowsVista\8cü\82¯\81A\83v\83\8d\83O\83\8c\83X\83o\81[\83X\83e\81[\83^\83X(\90F)\82ð\90Ý\92è\82·\82é\r
+               /// WindowsVista以降向け、プログレスバーステータス(色)を設定する。\r
                /// </summary>\r
-               /// <param name="progBar">\91Î\8fÛ\82Ì\83v\83\8d\83O\83\8c\83X\83o\81[</param>\r
-               /// <param name="state">\8fó\91Ô\81B(1:Normal,2:Error,3:Paused)</param>\r
-               public static void ProgressBar_SetState(ProgressBar progBar, uint state)\r
+               /// <param name="progBar">対象のプログレスバー</param>\r
+               /// <param name="state">状態(色)</param>\r
+               public static void ProgressBar_SetState(ProgressBar progBar, ProgressBarState state)\r
                {\r
+#if USE_VISTA_EFFECTS\r
                        try {\r
-                               // status := (PBST_NORMAL | PBST_ERROR | PBST_PAUSED)\r
                                // SendMessage(progressBar.Handle, PBM_SETSTATE, state, 0);\r
-                               SendMessage(progBar.Handle, 0x410, state, 0);\r
+                               SendMessage(progBar.Handle, 0x410, new IntPtr((int) state), IntPtr.Zero);\r
                        } catch (Exception) {\r
                        }\r
+#endif\r
                }\r
                \r
-               #region \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\82Ì\83t\83\89\83b\83V\83\85\r
+               #region タスクバー上の進捗表示のためのP/Invoke\r
+                       \r
+               internal enum TBPFLAG\r
+               {\r
+                       TBPF_NOPROGRESS = 0,\r
+                       TBPF_INDETERMINATE = 0x1,\r
+                       TBPF_NORMAL = 0x2,\r
+                       TBPF_ERROR = 0x4,\r
+                       TBPF_PAUSED = 0x8,\r
+               }\r
+               \r
+               [ComImport()]\r
+               [Guid("EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF")]\r
+               [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\r
+               internal interface ITaskList3\r
+               {\r
+                       void HrInit();\r
+                       void AddTab(IntPtr hWnd);\r
+                       void DeleteTab(IntPtr hWnd);\r
+                       void ActivateTab(IntPtr hWnd);\r
+                       void SetActiveAlt(IntPtr hWnd);\r
+                       void MarkFullscreenWindow(IntPtr hWnd, int fFullscreen);\r
+                       void SetProgressValue(IntPtr hWnd, ulong ullCompleted, ulong ullTotal);\r
+                       void SetProgressState(IntPtr hWnd, TBPFLAG tbpFlags);\r
+                       // more functions follows, but we do not need these.\r
+               }\r
+               \r
+               [ComImport()]\r
+               [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")]\r
+               [ClassInterface(ClassInterfaceType.None)]\r
+               internal class CTaskbarList\r
+               {\r
+               }\r
+               \r
+               #endregion\r
                \r
                /// <summary>\r
-               /// \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\83{\83^\83\93\82Ì\83t\83\89\83b\83V\83\85\82Ì\90Ý\92è\83t\83\89\83O\r
+               /// タスクバに進捗を設定する。\r
+               /// </summary>\r
+               /// <param name="form">対象フォーム</param>\r
+               /// <param name="style">表示スタイル</param>\r
+               /// <param name="state">ステータス(色)</param>\r
+               /// <param name="val">プログレスバーの値。0を指定すると進捗表示をしない</param>\r
+               /// <param name="maximum">プログレスバーの最大値。</param>\r
+               public static void Form_SetTaskbarProgressParams(Form form, ProgressBarStyle style, ProgressBarState state, ulong val, ulong maximum)\r
+               {\r
+#if USE_VISTA_EFFECTS\r
+#if USE_SEVEN_EFFECTS\r
+                       ITaskList3 tasklist = null;\r
+                       \r
+                       try {\r
+                               TBPFLAG tbpFlag = TBPFLAG.TBPF_NOPROGRESS;\r
+                               \r
+                               if (style == ProgressBarStyle.Marquee) {\r
+                                       tbpFlag |= TBPFLAG.TBPF_INDETERMINATE;\r
+                               } else if (val > 0 && maximum > 0) {\r
+                                       tbpFlag |= TBPFLAG.TBPF_NORMAL;\r
+                               }\r
+                               \r
+                               if (state == ProgressBarState.Error) {\r
+                                       tbpFlag |= TBPFLAG.TBPF_ERROR;\r
+                               }\r
+                               if (state == ProgressBarState.Paused) {\r
+                                       tbpFlag |= TBPFLAG.TBPF_PAUSED;\r
+                               }\r
+                               \r
+                               tasklist = (ITaskList3) new CTaskbarList();\r
+                               tasklist.HrInit();\r
+                               \r
+                               tasklist.SetProgressState(form.Handle, tbpFlag);\r
+                               tasklist.SetProgressValue(form.Handle, val, maximum);\r
+                       } catch (Exception) {\r
+                       } finally {\r
+                               if (tasklist != null) {\r
+                                       Marshal.ReleaseComObject(tasklist);\r
+                                       tasklist = null;\r
+                               }\r
+                       }\r
+#endif\r
+#endif\r
+               }\r
+               \r
+               #endregion\r
+                       \r
+               #region タスクバーおよびタイトルバーのフラッシュ\r
+               \r
+               /// <summary>\r
+               /// タスクバーおよびタイトルバーボタンのフラッシュの設定フラグ\r
                /// </summary>\r
                public enum FlashFlag : uint {\r
                        /// <summary>\r
-                       /// \93_\96Å\82Ì\92â\8e~\r
+                       /// 点滅の停止\r
                        /// </summary>\r
                        Stop = 0,\r
                        /// <summary>\r
-                       /// \83^\83C\83g\83\8b\83o\81[\82ð\93_\96Å\r
+                       /// タイトルバーを点滅\r
                        /// </summary>\r
                        Caption = 1,\r
                        /// <summary>\r
-                       /// \83^\83X\83N\83o\81[\83{\83^\83\93\82ð\93_\96Å\r
+                       /// タスクバーボタンを点滅\r
                        /// </summary>\r
                        Tray = 2,\r
                        /// <summary>\r
-                       /// \83^\83C\83g\83\8b\83o\81[\82Æ\83^\83X\83N\83o\81[\83{\83^\83\93\82ð\93_\96Å\r
+                       /// タイトルバーとタスクバーボタンを点滅\r
                        /// </summary>\r
                        All = 3,\r
                        /// <summary>\r
-                       /// Stop\82ª\90Ý\92è\82³\82ê\82é\82Ü\82Å\93_\96Å\82·\82é\r
+                       /// Stopが設定されるまで点滅する\r
                        /// </summary>\r
                        Timer = 4,\r
                        /// <summary>\r
-                       /// \83t\83H\83A\83O\83\89\83E\83\93\83h\82Ì\8fó\91Ô\82É\82È\82é\82Ü\82Å\93_\96Å\r
+                       /// フォアグラウンドの状態になるまで点滅\r
                        /// </summary>\r
                        TimerNoFG = 12,\r
                }\r
@@ -69,12 +187,12 @@ namespace AppliStation.Util
                }\r
                \r
                /// <summary>\r
-               /// \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\83{\83^\83\93\82ð\93_\96Å\82³\82¹\82é\r
+               /// タスクバーおよびタイトルバーボタンを点滅させる\r
                /// </summary>\r
-               /// <param name="form">\91Î\8fÛ\83t\83H\81[\83\80</param>\r
-               /// <param name="flag">\93_\96Å\83p\83\89\83\81\81[\83^\83t\83\89\83O</param>\r
-               /// <param name="count">\93_\96Å\89ñ\90\94</param>\r
-               /// <param name="timeout">\93_\96Å\82Ì\8aÔ\8au(\83~\83\8a\95b)</param>\r
+               /// <param name="form">対象フォーム</param>\r
+               /// <param name="flag">点滅パラメータフラグ</param>\r
+               /// <param name="count">点滅回数</param>\r
+               /// <param name="timeout">点滅の間隔(ミリ秒)</param>\r
                /// <returns></returns>\r
                public static bool Form_FlashWindow(Form form, FlashFlag flag, uint count, uint timeout)\r
                {\r
@@ -97,10 +215,64 @@ namespace AppliStation.Util
                \r
                #endregion\r
                \r
-               #region ColumnHeader\82Ì\83\\81[\83g\82Ì\8eO\8ap\88ó\97p\r
+               #region ListView関連\r
+               \r
+               /// <summary>\r
+               /// リストビューにダブルバッファでの描画をするか否かを設定する\r
+               /// </summary>\r
+               /// <remarks>マウスでの選択に半透明ツールを採用するか否かもこの設定に依存</remarks>\r
+               /// <param name="listView">対象のリストビュー</param>\r
+               /// <param name="bEnable">ダブルバッファでの描画をするとき<code>true</code></param>\r
+               public static void ListView_SetDoubleBuffer(ListView listView, bool bEnable)\r
+               {\r
+                       try {\r
+                               // SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, bEnable? LVS_EX_DOUBLEBUFFER:0);\r
+                               SendMessage(listView.Handle, 0x1036, new IntPtr(0x00010000), new IntPtr((bEnable)? 0x00010000u:0x0u));\r
+                       } catch (Exception) {\r
+                       }\r
+               }\r
+               \r
+               /// <summary>\r
+               /// 選択されたアイテムの部分の背景にグラデーションがかかった感じになる、\r
+               /// Vista以降でのエクスプローラの見た目をListViewに反映させる。\r
+               /// </summary>\r
+               /// <remarks>Vista未満のバージョンでは何もしない。</remarks>\r
+               /// <param name="listView">対象のListView</param>\r
+               public static void ListView_EnableVistaExplorerTheme(ListView listView)\r
+               {\r
+#if USE_VISTA_EFFECTS\r
+                       // Vista未満はなにもしない\r
+                       OperatingSystem os = Environment.OSVersion;\r
+                       if (os.Platform != PlatformID.Win32NT || os.Version.Major < 6) return;\r
+                       \r
+                       try {\r
+                               SetWindowTheme(listView.Handle, "explorer", null);\r
+                       } catch (Exception) {\r
+                       }\r
+#endif\r
+               }\r
+               \r
+               /// <summary>\r
+               /// ヘッダに"すべて選択"に似たチェックボックスを作るか否かを指定する\r
+               /// </summary>\r
+               /// <remarks>このオプションを設定するとVistaエクスプローラでの「チェックボックスを使用して項目を選択する」と同様の動作になる</remarks>\r
+               /// <param name="listView">対象のListBox</param>\r
+               /// <param name="bAutoCheckSelect">チェックボックスを使用して項目を選択するとき<code>true</code></param>\r
+               public static void ListView_SetAutoCheckSelect(ListView listView, bool bAutoCheckSelect)\r
+               {\r
+#if USE_VISTA_EFFECTS\r
+                       try {\r
+                               // SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_AUTOCHECKSELECT, bAutoCheckSelect?LVS_EX_AUTOCHECKSELECT:0);\r
+                               SendMessage(listView.Handle, 0x1036, new IntPtr(0x08000000), new IntPtr((bAutoCheckSelect)?0x08000000u:0x0u));\r
+                       } catch (Exception) {\r
+                       }\r
+#endif\r
+               }\r
+               \r
+               #region ColumnHeaderのソートの三角印用\r
                \r
                [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]\r
-               internal struct HD_ITEM\r
+               private struct HD_ITEM\r
                {\r
                        public uint    mask;\r
                        public int     cxy;\r
@@ -113,58 +285,76 @@ namespace AppliStation.Util
                        public int     iOrder;\r
                }\r
                \r
-               internal static IntPtr ListView_GetHeader(ListView listview)\r
-               {\r
-                       // SendMessage(hWnd, LVM_GETHEADER, 0, NULL);\r
-                       return SendMessage(listview.Handle, 0x101E, 0, 0);\r
-               }\r
-               \r
                /// <summary>\r
-               /// WinXP\88È\8d~\81A\83\\81[\83g\82Ì\96î\88ó\82ð\95\\8e¦\r
+               /// WinXP以降、ソートの矢印を表示\r
                /// </summary>\r
-               /// <param name="listView">\91Î\8fÛ\82ÌListView</param>\r
-               /// <param name="column">\95\\8e¦\82·\82é\96î\88ó\82Ì\83w\83b\83_</param>\r
-               /// <param name="order">\83\\81[\83g\82Ì\8f¸\8f\87\81E\8d~\8f\87</param>\r
+               /// <param name="listView">対象のListView</param>\r
+               /// <param name="column">表示する矢印のヘッダ</param>\r
+               /// <param name="order">ソートの昇順・降順</param>\r
                public static void ColumnHeader_SetSortState(ListView listView, int column, SortOrder order)\r
                {\r
                        try {\r
                                // SendMessage(hWnd, LVM_GETHEADER, NULL, NULL);\r
-                               IntPtr hWnd = SendMessage(listView.Handle, 0x101F, 0, 0);\r
+                               IntPtr hWnd = SendMessage(listView.Handle, 0x101F, IntPtr.Zero, IntPtr.Zero);\r
                                \r
                                HD_ITEM hdi = new HD_ITEM();\r
                                hdi.mask = 0x0004; // HDI_FORMAT;\r
                                for (int i = 0; i < listView.Columns.Count; i++) {\r
                                        // SendMessage(hWnd, HDM_GETITEMW, i, &hdi);\r
-                                       SendMessage(hWnd, 0x120b, i, ref hdi);\r
+                                       SendMessage(hWnd, 0x120b, new IntPtr(i), ref hdi);\r
                                        \r
                                        const int HDF_SORTUP = 0x400;\r
                                        const int HDF_SORTDOWN = 0x200;\r
                                        \r
                                        if (i != column || order == SortOrder.None) {\r
                                                hdi.fmt = hdi.fmt & ~(HDF_SORTUP | HDF_SORTDOWN);\r
-                                       } else if (order == SortOrder.Ascending) { // \8f¸\8f\87\r
+                                       } else if (order == SortOrder.Ascending) { // 昇順\r
                                                hdi.fmt = hdi.fmt & ~HDF_SORTDOWN | HDF_SORTUP;\r
-                                       } else if (order == SortOrder.Descending) { // \8d~\8f\87\r
+                                       } else if (order == SortOrder.Descending) { // 降順\r
                                                hdi.fmt = hdi.fmt & ~HDF_SORTUP | HDF_SORTDOWN;\r
                                        }\r
                                        \r
                                        // SendMessage(hWnd, HDM_SETITEMW, i, &hdi);\r
-                                       SendMessage(hWnd, 0x120c, i, ref hdi);\r
+                                       SendMessage(hWnd, 0x120c, new IntPtr(i), ref hdi);\r
                                }\r
                        } catch (Exception) {\r
                        }\r
                }\r
                \r
+               /// <summary>\r
+               /// ヘッダ部のサイズを返す\r
+               /// </summary>\r
+               /// <param name="listView">ListView</param>\r
+               /// <returns>ヘッダ部のクライアントサイズ</returns>\r
+               public static Size ColumnHeader_GetSize(ListView listView)\r
+               {\r
+                       LRECT lrect;\r
+                       \r
+                       try {\r
+                               // SendMessage(hWnd, LVM_GETHEADER, NULL, NULL);\r
+                               IntPtr hWnd = SendMessage(listView.Handle, 0x101F, IntPtr.Zero, IntPtr.Zero);\r
+                               GetClientRect(hWnd, out lrect);\r
+                       } catch {\r
+                               lrect.Left = lrect.Right = lrect.Top = lrect.Bottom = 0;\r
+                       }\r
+                       \r
+                       Size size = new Size(lrect.Right - lrect.Left,\r
+                                       lrect.Bottom - lrect.Top);\r
+                       return size;\r
+               }\r
+               \r
                #endregion\r
                \r
-               #region EnableWindow(\83R\83\81\83\93\83g\83A\83E\83g)\r
+               #endregion\r
+               \r
+               #region EnableWindow(コメントアウト)\r
 //             /// <summary>\r
-//             /// \8ew\92è\82³\82ê\82½\83R\83\93\83g\83\8d\81[\83\8b(\83E\83B\83\93\83h\83E)\82Ö\82Ì\81A\r
-//             /// \83L\81[\83{\81[\83h\93ü\97Í\82¨\82æ\82Ñ\83}\83E\83X\93ü\97Í\82ð\97L\8cø\89»\82Ü\82½\82Í\96³\8cø\89»\r
+//             /// 指定されたコントロール(ウィンドウ)への、\r
+//             /// キーボード入力およびマウス入力を有効化または無効化\r
 //             /// </summary>\r
-//             /// <param name="control">\91Î\8fÛ\82Ì\83R\83\93\83g\83\8d\81[\83\8b\82Ì\83n\83\93\83h\83\89</param>\r
-//             /// <param name="bEnable">\97L\8cø\82É\82·\82é\82©\96³\8cø\82É\82·\82é\82©\82ð\8ew\92è</param>\r
-//             /// <returns>\92¼\91O\82É\83E\83B\83\93\83h\83E\82ª\96³\8cø\8fó\91Ô\82¾\82Á\82½\8fê\8d\87\82Ítrue\82ð\95Ô\82·</returns>\r
+//             /// <param name="control">対象のコントロールのハンドラ</param>\r
+//             /// <param name="bEnable">有効にするか無効にするかを指定</param>\r
+//             /// <returns>直前にウィンドウが無効状態だった場合はtrueを返す</returns>\r
 //             public static bool Control_EnableWindow(Control ctrl, bool bEnable)\r
 //             {\r
 //                     try {\r
@@ -176,20 +366,245 @@ namespace AppliStation.Util
 //             }\r
 //             \r
 //             /// <summary>\r
-//             /// \8ew\92è\82³\82ê\82½\83R\83\93\83g\83\8d\81[\83\8b(\83E\83B\83\93\83h\83E)\82Ö\82Ì\81A\r
-//             /// \83L\81[\83{\81[\83h\93ü\97Í\82¨\82æ\82Ñ\83}\83E\83X\93ü\97Í\82ð\97L\8cø\89»\82Ü\82½\82Í\96³\8cø\89»\r
+//             /// 指定されたコントロール(ウィンドウ)への、\r
+//             /// キーボード入力およびマウス入力を有効化または無効化\r
 //             /// </summary>\r
-//             /// <param name="control">\91Î\8fÛ\82Ì\83R\83\93\83g\83\8d\81[\83\8b\82Ì\83n\83\93\83h\83\89</param>\r
-//             /// <param name="bEnable">\97L\8cø\82É\82·\82é\82©\96³\8cø\82É\82·\82é\82©\82ð\8ew\92è</param>\r
-//             /// <returns>\92¼\91O\82É\83E\83B\83\93\83h\83E\82ª\96³\8cø\8fó\91Ô\82¾\82Á\82½\8fê\8d\87\82Ítrue\82ð\95Ô\82·</returns>\r
+//             /// <param name="control">対象のコントロールのハンドラ</param>\r
+//             /// <param name="bEnable">有効にするか無効にするかを指定</param>\r
+//             /// <returns>直前にウィンドウが無効状態だった場合はtrueを返す</returns>\r
 //             [DllImport("user32.dll")]\r
 //             public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);\r
                #endregion\r
+               \r
+               #region RichTextBox関連\r
+               \r
+               [StructLayout(LayoutKind.Sequential)]\r
+               private struct CHARFORMAT2\r
+               {\r
+                       public int cbSize;\r
+                       public uint dwMask;\r
+                       public uint dwEffects;\r
+                       public int yHeight;\r
+                       public int yOffset;\r
+                       public int crTextColor;\r
+                       public byte bCharSet;\r
+                       public byte bPitchAndFamily;\r
+                       [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]\r
+                       public char[] szFaceName;\r
+                       public short wWeight;\r
+                       public short sSpacing;\r
+                       public int crBackColor;\r
+                       public int LCID;\r
+                       public uint dwReserved;\r
+                       public short sStyle;\r
+                       public short wKerning;\r
+                       public byte bUnderlineType;\r
+                       public byte bAnimation;\r
+                       public byte bRevAuthor;\r
+                       public byte bReserved1;\r
+               }\r
+               \r
+               /// <summary>\r
+               /// リッチテキストの選択部分に文字フォーマット効果を与える\r
+               /// </summary>\r
+               /// <param name="richTextBox">対象のリッチテキストボックス</param>\r
+               /// <param name="dwMask">有効な文字フォーマット効果</param>\r
+               /// <param name="dwEffect">文字フォーマット効果のフラグ</param>\r
+               public static void RichTextBox_SetSelectionFormat(RichTextBox richTextBox, uint dwMask, uint dwEffect)\r
+               {\r
+                       CHARFORMAT2 cfmt = new CHARFORMAT2();\r
+                       cfmt.cbSize = Marshal.SizeOf(typeof(CHARFORMAT2));\r
+                       cfmt.dwMask = dwMask;\r
+                       cfmt.dwEffects = dwEffect;\r
+                       \r
+                       //SendMessage(richTextBox.Handle, EM_SETCHARFORMAT, SCF_SELECTION, ref cfmt);\r
+                       SendMessage(richTextBox.Handle, 0x0444, new IntPtr(0x0001), ref cfmt);\r
+               }\r
+               /// <summary>\r
+               /// リッチテキストにテキストリンクを追加する\r
+               /// </summary>\r
+               /// <param name="richTextBox">対象のリッチテキストボックス</param>\r
+               /// <param name="text">追加するテキスト</param>\r
+               public static void RichTextBox_AddTextLink(RichTextBox richTextBox, string text)\r
+               {\r
+                       int pos = richTextBox.TextLength;\r
+                       richTextBox.Select(pos,0);\r
+                       richTextBox.SelectedText = text;\r
+                       richTextBox.Select(pos, text.Length);\r
+                       \r
+                       // RichTextBox_SetSelectionFormat(richTextBox, CFM_LINK, CFE_LINK);\r
+                       RichTextBox_SetSelectionFormat(richTextBox, 0x00000020, 0x0020);\r
+                       \r
+                       richTextBox.Select(richTextBox.TextLength, 0);\r
+               }\r
+               \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
+               [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]\r
+               private struct SHSTOCKICONINFO\r
+               {\r
+                       public Int32 cbSize;\r
+                       public IntPtr hIcon;\r
+                       public Int32 iSysImageIndex;\r
+                       public Int32 iIcon;\r
+                       [MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] public string path;\r
+               }\r
+               \r
+               [DllImport("shell32.dll", CharSet=CharSet.Unicode, ExactSpelling=true, SetLastError=true)]\r
+               private static extern void SHGetStockIconInfo(uint siid, uint uFlags, ref SHSTOCKICONINFO sii);\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 USE_VISTA_EFFECTS\r
+                       if (Environment.OSVersion.Version.Major >= 6) {\r
+                               button.FlatStyle = FlatStyle.System;\r
+                               // SendMessage(hWnd, BCM_SETSHIELD, 0, required);\r
+                               SendMessage(button.Handle, 0x160C, IntPtr.Zero, new IntPtr((required)? 1u : 0u));\r
+                       } else { // Legacy OS\r
+#endif\r
+                               // FlatStyle.System に設定されている場合、Image プロパティに割り当てられているイメージは表示されない対策\r
+                               if (button.FlatStyle == FlatStyle.System) {\r
+                                       button.FlatStyle = FlatStyle.Standard;\r
+                               }\r
+                               \r
+                               button.TextImageRelation = TextImageRelation.ImageBeforeText;\r
+                               if (required) {\r
+                                       button.ImageAlign = ContentAlignment.MiddleLeft;\r
+                                       using (Icon ico = new Icon(SystemIcons.Shield, 16, 16)) {\r
+                                               button.Image = ico.ToBitmap();\r
+                                       }\r
+                               } else {\r
+                                       button.Image = null;\r
+                               }\r
+                               button.AutoSize = true;\r
+#if USE_VISTA_EFFECTS\r
+                       }\r
+#endif\r
+               }\r
+               \r
+               /// <summary>\r
+               /// シェルのソトックアイコンのハンドラを取得する。\r
+               /// </summary>\r
+               /// <param name="siid">ストックID</param>\r
+               /// <param name="isSmall">アイコンサイズは小さいのであればtrueを指定</param>\r
+               /// <returns>アイコンのハンドラ。存在しない場合、null</returns>\r
+               private static IntPtr SHGetStockIconHandle(uint siid, bool isSmall)\r
+               {\r
+#if USE_VISTA_EFFECTS\r
+                       try {\r
+                               SHSTOCKICONINFO sii = new SHSTOCKICONINFO();\r
+                               sii.cbSize = Marshal.SizeOf(typeof(SHSTOCKICONINFO));\r
+                               sii.hIcon = IntPtr.Zero;\r
+                               \r
+                               //SHGetStockIconInfo(siid, SHGFI_ICON | ((isSmall)? SHGFI_SMALLICON : SHGFI_LARGEICON), ref sii);\r
+                               SHGetStockIconInfo(siid, 0x100u | ((isSmall)? 0x1u : 0x0u), ref sii);\r
+                               \r
+                               return sii.hIcon;\r
+                       } catch (Exception) {\r
+                               return IntPtr.Zero;\r
+                       }\r
+#else\r
+                       return IntPtr.Zero;\r
+#endif\r
+               }\r
+               \r
+               /// <summary>\r
+               /// ユーザ昇格が必要か設定し、設定必要なときシールドアイコンを表示する。\r
+               /// </summary>\r
+               /// <param name="label">対象のリンクラベル</param>\r
+               /// <param name="required">ユーザ昇格が必要か否か、すなわちシールドアイコンを表示するか</param>           \r
+               public static void LinkLabel_SetElevationRequiredState(LinkLabel label, bool required)\r
+               {\r
+                       if (required) {\r
+                               IntPtr iconHandle = IntPtr.Zero;\r
+                               \r
+                               //SHGetStockIconHandle(SIID_SHIELD, true);\r
+                               iconHandle = SHGetStockIconHandle(77, true);\r
+                               if (iconHandle != IntPtr.Zero) {\r
+                                       label.Image = Bitmap.FromHicon(iconHandle);\r
+                               } else {\r
+                                       using (Icon ico = new Icon(SystemIcons.Shield, 16, 16)) {\r
+                                               label.Image = ico.ToBitmap();\r
+                                       }\r
+                               }\r
                                \r
+                               label.ImageAlign = ContentAlignment.MiddleLeft;\r
+                               label.Padding = new Padding(label.Image.Width, label.Padding.Top, label.Padding.Right, label.Padding.Bottom);\r
+                       } else {\r
+                               label.Image = null;\r
+                               label.Padding = new Padding(0);\r
+                       }\r
+               }\r
+               \r
+               #endregion\r
+               \r
+               [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
+               internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);\r
+               \r
                [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
-               internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);\r
+               private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, ref HD_ITEM lParam);\r
                \r
                [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
-               internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, int wParam, ref HD_ITEM lParam);\r
+               private static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, ref CHARFORMAT2 lParam);\r
+\r
+               [DllImport("uxtheme.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]\r
+               internal static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList);\r
+               \r
+               [Serializable]\r
+               [StructLayout(LayoutKind.Sequential)]\r
+               private struct LRECT {\r
+                       public int Left;\r
+                       public int Top;\r
+                       public int Right;\r
+                       public int Bottom;\r
+               }\r
+               \r
+               [DllImport("user32.dll")]\r
+               private static extern bool GetClientRect(IntPtr hWnd, out LRECT lpRect);\r
        }\r
 }\r