1 // Vistaの効果を有効にするフラグ(不要の場合はコメントアウト)
\r
2 #define USE_VISTA_EFFECTS
\r
5 using System.Runtime.InteropServices;
\r
6 using System.Windows.Forms;
\r
7 using System.Drawing;
\r
9 namespace AppliStation.Util
\r
12 /// Win32ネイティブメソッドを叩いてGUI操作するための関数群のクラス
\r
14 public sealed class NativeMethods
\r
19 private NativeMethods()
\r
24 /// WindowsVista向け、プログレスバーステータス(色)を設定する
\r
26 /// <param name="progBar">対象のプログレスバー</param>
\r
27 /// <param name="state">状態。(1:Normal,2:Error,3:Paused)</param>
\r
28 public static void ProgressBar_SetState(ProgressBar progBar, uint state)
\r
30 #if USE_VISTA_EFFECTS
\r
32 // status := (PBST_NORMAL | PBST_ERROR | PBST_PAUSED)
\r
33 // SendMessage(progressBar.Handle, PBM_SETSTATE, state, 0);
\r
34 SendMessage(progBar.Handle, 0x410, state, 0);
\r
35 } catch (Exception) {
\r
40 #region タスクバーおよびタイトルバーのフラッシュ
\r
43 /// タスクバーおよびタイトルバーボタンのフラッシュの設定フラグ
\r
45 public enum FlashFlag : uint {
\r
59 /// タイトルバーとタスクバーボタンを点滅
\r
63 /// Stopが設定されるまで点滅する
\r
67 /// フォアグラウンドの状態になるまで点滅
\r
72 [StructLayout(LayoutKind.Sequential)]
\r
77 public FlashFlag dwFlags;
\r
79 public uint dwTimeout;
\r
83 /// タスクバーおよびタイトルバーボタンを点滅させる
\r
85 /// <param name="form">対象フォーム</param>
\r
86 /// <param name="flag">点滅パラメータフラグ</param>
\r
87 /// <param name="count">点滅回数</param>
\r
88 /// <param name="timeout">点滅の間隔(ミリ秒)</param>
\r
89 /// <returns></returns>
\r
90 public static bool Form_FlashWindow(Form form, FlashFlag flag, uint count, uint timeout)
\r
93 FLASHWINFO info = new FLASHWINFO();
\r
94 info.cbSize = Marshal.SizeOf(typeof(FLASHWINFO));
\r
95 info.hWnd = form.Handle;
\r
96 info.dwFlags = flag;
\r
97 info.uCount = count;
\r
98 info.dwTimeout = timeout;
\r
100 return FlashWindowEx(ref info) == 0;
\r
101 } catch (Exception) {
\r
106 [DllImport("user32.dll")]
\r
107 static extern Int32 FlashWindowEx(ref FLASHWINFO pwfi);
\r
114 /// リストビューにダブルバッファでの描画をするか否かを設定する
\r
116 /// <remarks>マウスでの選択に半透明ツールを採用するか否かもこの設定に依存</remarks>
\r
117 /// <param name="listView">対象のリストビュー</param>
\r
118 /// <param name="bEnable">ダブルバッファでの描画をするとき<code>true</code></param>
\r
119 public static void ListView_SetDoubleBuffer(ListView listView, bool bEnable)
\r
122 // SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, bEnable? LVS_EX_DOUBLEBUFFER:0);
\r
123 SendMessage(listView.Handle, 0x1036, 0x00010000, ((bEnable)? 0x00010000u:0x0u));
\r
124 } catch (Exception) {
\r
129 /// 選択されたアイテムの部分の背景にグラデーションがかかった感じになる、
\r
130 /// Vista以降でのエクスプローラの見た目をListViewに反映させる。
\r
132 /// <remarks>Vista未満のバージョンでは何もしない。</remarks>
\r
133 /// <param name="listView">対象のListView</param>
\r
134 public static void ListView_EnableVistaExplorerTheme(ListView listView)
\r
136 #if USE_VISTA_EFFECTS
\r
138 OperatingSystem os = Environment.OSVersion;
\r
139 if (os.Platform != PlatformID.Win32NT || os.Version.Major < 6) return;
\r
142 SetWindowTheme(listView.Handle, "explorer", null);
\r
143 } catch (Exception) {
\r
149 /// ヘッダに"すべて選択"に似たチェックボックスを作るか否かを指定する
\r
151 /// <remarks>このオプションを設定するとVistaエクスプローラでの「チェックボックスを使用して項目を選択する」と同様の動作になる</remarks>
\r
152 /// <param name="listView">対象のListBox</param>
\r
153 /// <param name="bAutoCheckSelect">チェックボックスを使用して項目を選択するとき<code>true</code></param>
\r
154 public static void ListView_SetAutoCheckSelect(ListView listView, bool bAutoCheckSelect)
\r
156 #if USE_VISTA_EFFECTS
\r
158 // SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_AUTOCHECKSELECT, bAutoCheckSelect?LVS_EX_AUTOCHECKSELECT:0);
\r
159 SendMessage(listView.Handle, 0x1036, 0x08000000, (bAutoCheckSelect)?0x08000000u:0x0u);
\r
160 } catch (Exception) {
\r
165 #region ColumnHeaderのソートの三角印用
\r
167 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
\r
168 private struct HD_ITEM
\r
172 [MarshalAs(UnmanagedType.LPTStr)]public string pszText;
\r
174 public int cchTextMax;
\r
176 [MarshalAs(UnmanagedType.LPTStr)]public string lParam;
\r
177 public int iImage; // index of bitmap in ImageList
\r
181 internal static IntPtr ListView_GetHeader(ListView listview)
\r
183 // SendMessage(hWnd, LVM_GETHEADER, 0, NULL);
\r
184 return SendMessage(listview.Handle, 0x101E, 0, 0);
\r
188 /// WinXP以降、ソートの矢印を表示
\r
190 /// <param name="listView">対象のListView</param>
\r
191 /// <param name="column">表示する矢印のヘッダ</param>
\r
192 /// <param name="order">ソートの昇順・降順</param>
\r
193 public static void ColumnHeader_SetSortState(ListView listView, int column, SortOrder order)
\r
196 // SendMessage(hWnd, LVM_GETHEADER, NULL, NULL);
\r
197 IntPtr hWnd = SendMessage(listView.Handle, 0x101F, 0, 0);
\r
199 HD_ITEM hdi = new HD_ITEM();
\r
200 hdi.mask = 0x0004; // HDI_FORMAT;
\r
201 for (int i = 0; i < listView.Columns.Count; i++) {
\r
202 // SendMessage(hWnd, HDM_GETITEMW, i, &hdi);
\r
203 SendMessage(hWnd, 0x120b, i, ref hdi);
\r
205 const int HDF_SORTUP = 0x400;
\r
206 const int HDF_SORTDOWN = 0x200;
\r
208 if (i != column || order == SortOrder.None) {
\r
209 hdi.fmt = hdi.fmt & ~(HDF_SORTUP | HDF_SORTDOWN);
\r
210 } else if (order == SortOrder.Ascending) { // 昇順
\r
211 hdi.fmt = hdi.fmt & ~HDF_SORTDOWN | HDF_SORTUP;
\r
212 } else if (order == SortOrder.Descending) { // 降順
\r
213 hdi.fmt = hdi.fmt & ~HDF_SORTUP | HDF_SORTDOWN;
\r
216 // SendMessage(hWnd, HDM_SETITEMW, i, &hdi);
\r
217 SendMessage(hWnd, 0x120c, i, ref hdi);
\r
219 } catch (Exception) {
\r
227 #region EnableWindow(コメントアウト)
\r
229 // /// 指定されたコントロール(ウィンドウ)への、
\r
230 // /// キーボード入力およびマウス入力を有効化または無効化
\r
232 // /// <param name="control">対象のコントロールのハンドラ</param>
\r
233 // /// <param name="bEnable">有効にするか無効にするかを指定</param>
\r
234 // /// <returns>直前にウィンドウが無効状態だった場合はtrueを返す</returns>
\r
235 // public static bool Control_EnableWindow(Control ctrl, bool bEnable)
\r
238 // return EnableWindow(ctrl.Handle, bEnable);
\r
240 // ctrl.Enabled = bEnable;
\r
246 // /// 指定されたコントロール(ウィンドウ)への、
\r
247 // /// キーボード入力およびマウス入力を有効化または無効化
\r
249 // /// <param name="control">対象のコントロールのハンドラ</param>
\r
250 // /// <param name="bEnable">有効にするか無効にするかを指定</param>
\r
251 // /// <returns>直前にウィンドウが無効状態だった場合はtrueを返す</returns>
\r
252 // [DllImport("user32.dll")]
\r
253 // public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
\r
256 #region RichTextBox関連
\r
258 [StructLayout(LayoutKind.Sequential)]
\r
259 private struct CHARFORMAT2
\r
262 public uint dwMask;
\r
263 public uint dwEffects;
\r
264 public int yHeight;
\r
265 public int yOffset;
\r
266 public int crTextColor;
\r
267 public byte bCharSet;
\r
268 public byte bPitchAndFamily;
\r
269 [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]
\r
270 public char[] szFaceName;
\r
271 public short wWeight;
\r
272 public short sSpacing;
\r
273 public int crBackColor;
\r
275 public uint dwReserved;
\r
276 public short sStyle;
\r
277 public short wKerning;
\r
278 public byte bUnderlineType;
\r
279 public byte bAnimation;
\r
280 public byte bRevAuthor;
\r
281 public byte bReserved1;
\r
285 /// リッチテキストの選択部分に文字フォーマット効果を与える
\r
287 /// <param name="richTextBox">対象のリッチテキストボックス</param>
\r
288 /// <param name="dwMask">有効な文字フォーマット効果</param>
\r
289 /// <param name="dwEffect">文字フォーマット効果のフラグ</param>
\r
290 public static void RichTextBox_SetSelectionFormat(RichTextBox richTextBox, uint dwMask, uint dwEffect)
\r
292 CHARFORMAT2 cfmt = new CHARFORMAT2();
\r
293 cfmt.cbSize = Marshal.SizeOf(typeof(CHARFORMAT2));
\r
294 cfmt.dwMask = dwMask;
\r
295 cfmt.dwEffects = dwEffect;
\r
297 //SendMessage(richTextBox.Handle, EM_SETCHARFORMAT, SCF_SELECTION, ref cfmt);
\r
298 SendMessage(richTextBox.Handle, 0x0444, 0x0001, ref cfmt);
\r
301 /// リッチテキストにテキストリンクを追加する
\r
303 /// <param name="richTextBox">対象のリッチテキストボックス</param>
\r
304 /// <param name="text">追加するテキスト</param>
\r
305 public static void RichTextBox_AddTextLink(RichTextBox richTextBox, string text)
\r
307 int pos = richTextBox.TextLength;
\r
308 richTextBox.Select(pos,0);
\r
309 richTextBox.SelectedText = text;
\r
310 richTextBox.Select(pos, text.Length);
\r
312 // RichTextBox_SetSelectionFormat(richTextBox, CFM_LINK, CFE_LINK);
\r
313 RichTextBox_SetSelectionFormat(richTextBox, 0x00000020, 0x0020);
\r
315 richTextBox.Select(richTextBox.TextLength, 0);
\r
322 [DllImport("shell32.dll")]
\r
323 private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
\r
325 [DllImport("user32.dll", SetLastError=true)]
\r
326 [return: MarshalAs(UnmanagedType.Bool)]
\r
327 private static extern bool DestroyIcon(IntPtr hIcon);
\r
331 /// アイコンファイル(実行ファイル・DLL)を開いてアイコンを作る
\r
333 /// <remarks>内部でコピーされるのでWin32APIのDestroyIconを使わないでいいが、やや遅い動作</remarks>
\r
334 /// <param name="form">ハンドラ</param>
\r
335 /// <param name="lpszExeFileName">対象ファイル</param>
\r
336 /// <param name="nIconIndex">アイコンインデックス</param>
\r
337 /// <returns>生成されたアイコン</returns>
\r
338 public static Icon ExtractIcon(Form form, string lpszExeFileName, uint nIconIndex)
\r
342 if (! System.IO.File.Exists(lpszExeFileName)) {
\r
343 ico = Icon.ExtractAssociatedIcon(lpszExeFileName); // ExtractAssociatedIconに例外を吐いてもらう
\r
345 IntPtr hInst = (form != null)? form.Handle : IntPtr.Zero;
\r
346 IntPtr hIcon = IntPtr.Zero;
\r
349 hIcon = ExtractIcon(hInst, lpszExeFileName, (int) nIconIndex);
\r
350 if ((hIcon != IntPtr.Zero) && (hIcon.ToInt32() != 2)) {
\r
351 ico = (Icon) Icon.FromHandle(hIcon).Clone();
\r
352 DestroyIcon(hIcon);
\r
354 } catch (System.Runtime.InteropServices.COMException) {
\r
355 // ExtraIconのP/Invoke失敗時用
\r
362 /// ユーザ昇格が必要か設定し、設定必要なときシールドアイコンを表示する。
\r
364 /// <param name="button">対象のボタン</param>
\r
365 /// <param name="required">ユーザ昇格が必要か否か、すなわちシールドアイコンを表示するか</param>
\r
366 public static void Button_SetElevationRequiredState(Button button, bool required)
\r
368 if (Environment.OSVersion.Version.Major >= 6) {
\r
369 button.FlatStyle = FlatStyle.System;
\r
370 // SendMessage(hWnd, BCM_SETSHIELD, 0, required);
\r
371 SendMessage(button.Handle, 0x160C, 0, (required)? 1u : 0u);
\r
372 } else { // Legacy OS
\r
373 // FlatStyle.System に設定されている場合、Image プロパティに割り当てられているイメージは表示されない対策
\r
374 if (button.FlatStyle == FlatStyle.System) {
\r
375 button.FlatStyle = FlatStyle.Standard;
\r
378 button.TextImageRelation = TextImageRelation.ImageBeforeText;
\r
379 button.ImageAlign = ContentAlignment.MiddleLeft;
\r
380 using (Icon ico = new Icon(SystemIcons.Shield, 16, 16)) {
\r
381 button.Image = ico.ToBitmap();
\r
383 button.AutoSize = true;
\r
389 [DllImport("user32.dll", CharSet=CharSet.Auto)]
\r
390 internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);
\r
392 [DllImport("user32.dll", CharSet=CharSet.Auto)]
\r
393 private static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, int wParam, ref HD_ITEM lParam);
\r
395 [DllImport("user32.dll", CharSet=CharSet.Auto)]
\r
396 private static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, int wParam, ref CHARFORMAT2 lParam);
\r
398 [DllImport("uxtheme.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
\r
399 internal static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList);
\r