+ #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
+ /// タスクバに進捗を設定する。\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_EFFECT\r
+#if USE_SEVEN_EFFECT\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
+ } finally {\r
+ if (tasklist != null) {\r
+ Marshal.ReleaseComObject(tasklist);\r
+ tasklist = null;\r
+ }\r
+ }\r
+#endif\r
+#endif\r
+ }\r
+ \r
+ #endregion\r
+ \r