|
|||||
<このサンプルの概要> タスク スケジュールを登録するサンプルです。定期的に実行(起動)するタスク登録に如何でしょうか。 3流プログラマのメモ書き様(http://jehupc.exblog.jp/)のサンプルを参考にしています。 こちらでは、タスク登録方法を色々な方法を試しています。試している事は以下の項目です。 1.一回だけ実行するタスク・スケジューラの作成 2.毎日(または2日に)、1回だけ実行するタスク・スケジューラの作成 3.毎日、3時間に1回、実行するタスク・スケジューラの作成 4.毎週、月水金曜日に実行するタスク・スケジューラの作成 5.毎月、15日に実行するタスク・スケジューラの作成 実は、タスク スケジューラを登録するサンプルは「古いごみ削除ツール(NonRccDel)」で 使用したいと思い勉強したのですが、まだ実装出来ていません。 代わりにマニュアルを作りましたが... クラス(Class1.cs) using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; class Class1 { private static Guid CLSID_CTaskScheduler =new Guid("{148BD52A-A2AB-11CE-B11F-00AA00530503}"); private static Guid CLSID_CTask =new Guid("{148BD520-A2AB-11CE-B11F-00AA00530503}"); private static Guid IID_ITaskScheduler =new Guid("{148BD527-A2AB-11CE-B11F-00AA00530503}"); private static Guid IID_ITask = new Guid("{148BD524-A2AB-11CE-B11F-00AA00530503}"); private enum CLSCTX : int { CLSCTX_INPROC_SERVER = 0x1, CLSCTX_INPROC_HANDLER = 0x2, CLSCTX_LOCAL_SERVER = 0x4, CLSCTX_INPROC_SERVER16 = 0x8, CLSCTX_REMOTE_SERVER = 0x10, CLSCTX_INPROC_HANDLER16 = 0x20, CLSCTX_RESERVED1 = 0x40, CLSCTX_RESERVED2 = 0x80, CLSCTX_RESERVED3 = 0x100, CLSCTX_RESERVED4 = 0x200, CLSCTX_NO_CODE_DOWNLOAD = 0x400, CLSCTX_RESERVED5 = 0x800, CLSCTX_NO_CUSTOM_MARSHAL = 0x1000, CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000, CLSCTX_NO_FAILURE_LOG = 0x4000, CLSCTX_DISABLE_AAA = 0x8000, CLSCTX_ENABLE_AAA = 0x10000, CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000, CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER } private enum TASK_TRIGGER_TYPE : int { TASK_TIME_TRIGGER_ONCE = 0, TASK_TIME_TRIGGER_DAILY = 1, TASK_TIME_TRIGGER_WEEKLY = 2, TASK_TIME_TRIGGER_MONTHLYDATE = 3, TASK_TIME_TRIGGER_MONTHLYDOW = 4, TASK_EVENT_TRIGGER_ON_IDLE = 5, TASK_EVENT_TRIGGER_AT_SYSTEMSTART = 6, TASK_EVENT_TRIGGER_AT_LOGON = 7 } private struct DAILY { public short DaysInterval; public DAILY(int dummy) { DaysInterval = 0; } } private struct WEEKLY { public short WeeksInterval; public short rgfDaysOfTheWeek; public WEEKLY(int dummy) { WeeksInterval = 0; rgfDaysOfTheWeek = 0; } } private struct MONTHLYDATE { public int rgfDays; public short rgfMonths; public MONTHLYDATE(int dummy) { rgfDays = 0; rgfMonths = 0; } } private struct MONTHLYDOW { public short wWhichWeek; public short rgfDaysOfTheWeek; public short rgfMonths; public MONTHLYDOW(int dummy) { wWhichWeek = 0; rgfDaysOfTheWeek = 0; rgfMonths = 0; } } [StructLayout(LayoutKind.Explicit)] private struct TRIGGER_TYPE_UNION { [FieldOffset(0)] public DAILY Daily; [FieldOffset(0)] public WEEKLY Weekly; [FieldOffset(0)] public MONTHLYDATE MonthlyDate; [FieldOffset(0)] public MONTHLYDOW MonthlyDOW; } [StructLayout(LayoutKind.Sequential)] private struct TASK_TRIGGER { public short cbTriggerSize; public short Reserved1; public short wBeginYear; public short wBeginMonth; public short wBeginDay; public short wEndYear; public short wEndMonth; public short wEndDay; public short wStartHour; public short wStartMinute; public int MinutesDuration; public int MinutesInterval; public int rgFlags; public TASK_TRIGGER_TYPE TriggerType; public TRIGGER_TYPE_UNION Type; public short Reserved2; public short wRandomMinutesInterval; } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("148BD527-A2AB-11CE-B11F-00AA00530503")] private interface ITaskScheduler { void SetTargetComputer(); void GetTargetComputer(); void Enum_(); void Activate(); void Delete(); [return: MarshalAs(UnmanagedType.Interface)] Object NewWorkItem([In, MarshalAs(UnmanagedType.LPWStr)] String pwszTaskName, [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid); void AddWorkItem(); void IsOfType(); } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("148BD524-A2AB-11CE-B11F-00AA00530503")] private interface ITask { [return: MarshalAs(UnmanagedType.Interface)] Object CreateTrigger(out short iNewTrigger); void DeleteTrigger(); void GetTriggerCount(); void GetTrigger(); void GetTriggerString(); void GetRunTimes(); void GetNextRunTime(); void SetIdleWait(); void GetIdleWait(); void Run(); void Terminate(); void EditWorkItem(); void GetMostRecentRunTime(); void GetStatus(); void GetExitCode(); void SetComment(); void GetComment(); void SetCreator(); void GetCreator(); void SetWorkItemData(); void GetWorkItemData(); void SetErrorRetryCount(); void GetErrorRetryCount(); void SetErrorRetryInterval(); void GetErrorRetryInterval(); void SetFlags(); void GetFlags(); void SetAccountInformation( [In, MarshalAs(UnmanagedType.LPWStr)] String pwszAccountName, [In, MarshalAs(UnmanagedType.LPWStr)] String pwszPassword); void GetAccountInformation(); void SetApplicationName( [In, MarshalAs(UnmanagedType.LPWStr)] String pwszApplicationName); void GetApplicationName(); void SetParameters(); void GetParameters(); void SetWorkingDirectory(); void GetWorkingDirectory(); void SetPriority(); void GetPriority(); void SetTaskFlags(); void GetTaskFlags(); void SetMaxRunTime(); void GetMaxRunTime(); } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("148BD52B-A2AB-11CE-B11F-00AA00530503")] private interface ITaskTrigger { void SetTrigger(ref TASK_TRIGGER pTrigger); void GetTrigger(); void GetTriggerString(); } [DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)] [return: MarshalAs(UnmanagedType.Interface)] private static extern Object CoCreateInstance( [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid , [MarshalAs(UnmanagedType.IUnknown)] Object pUnkOuter, CLSCTX dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid); private ITaskScheduler objTaskScheduler = null; private ITask objTask = null; private ITaskTrigger objTaskTrigger = null; private IPersistFile objPersistFile = null; // 1回だけ実行するタスク・スケジューラの作成 public void Test1() { try{ // タスク作成(タスク名) objTaskScheduler = (ITaskScheduler)CoCreateInstance( CLSID_CTaskScheduler, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_ITaskScheduler); objTask = (ITask)objTaskScheduler.NewWorkItem("TaskName1", CLSID_CTask, IID_ITask); // 実行プログラム設定 objTask.SetApplicationName("notepad.exe"); // 実行アカウント名とパスワード設定 objTask.SetAccountInformation("user", "password"); // トリガー作成 short iNewTrigger; objTaskTrigger = (ITaskTrigger)objTask.CreateTrigger(out iNewTrigger); // スケジュール設定------------------------------------------------------ TASK_TRIGGER pTrigger = new TASK_TRIGGER(); pTrigger.cbTriggerSize = (short)Marshal.SizeOf(pTrigger); pTrigger.wBeginYear = 2100; // 2100年 pTrigger.wBeginMonth = 12; // 12月 pTrigger.wBeginDay = 31; // 31日 pTrigger.wStartHour = 17; // 17時 pTrigger.wStartMinute = 30; // 30分 pTrigger.TriggerType = TASK_TRIGGER_TYPE.TASK_TIME_TRIGGER_ONCE; objTaskTrigger.SetTrigger(ref pTrigger); // ---------------------------------------------------------------------- // タスク保存 IntPtr pPersistFile = IntPtr.Zero; Guid IID_IPersistFile = Marshal.GenerateGuidForType(typeof(IPersistFile)); Marshal.QueryInterface( Marshal.GetIUnknownForObject(objTask), ref IID_IPersistFile, out pPersistFile); objPersistFile = (IPersistFile)Marshal.GetObjectForIUnknown(pPersistFile); objPersistFile.Save(null, true); }catch(Exception ex){ throw ex; }finally{ // COMオブジェクト解放 ReleaseComObject(); } } // 毎日(または2日に)、1回だけ実行するタスク・スケジューラの作成 public void Test2() { try { // タスク作成(タスク名) objTaskScheduler = (ITaskScheduler)CoCreateInstance( CLSID_CTaskScheduler, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_ITaskScheduler); objTask = (ITask)objTaskScheduler.NewWorkItem("TaskName2", CLSID_CTask, IID_ITask); // 実行プログラム設定 objTask.SetApplicationName("notepad.exe"); // 実行アカウント名とパスワード設定 objTask.SetAccountInformation("user", "password"); // トリガー作成 short iNewTrigger; objTaskTrigger = (ITaskTrigger)objTask.CreateTrigger(out iNewTrigger); // スケジュール設定------------------------------------------------------ TASK_TRIGGER pTrigger = new TASK_TRIGGER(); pTrigger.cbTriggerSize = (short)Marshal.SizeOf(pTrigger); pTrigger.wBeginYear = 2100; // 2100年 pTrigger.wBeginMonth = 12; // 12月 pTrigger.wBeginDay = 31; // 31日 pTrigger.wStartHour = 17; // 17時 pTrigger.wStartMinute = 30; // 30分 //pTrigger.Type.Daily.DaysInterval = 1; // 1日に1回 pTrigger.Type.Daily.DaysInterval = 2; // 2日に1回 pTrigger.TriggerType = TASK_TRIGGER_TYPE.TASK_TIME_TRIGGER_DAILY; objTaskTrigger.SetTrigger(ref pTrigger); // ---------------------------------------------------------------------- // タスク保存 IntPtr pPersistFile = IntPtr.Zero; Guid IID_IPersistFile = Marshal.GenerateGuidForType(typeof(IPersistFile)); Marshal.QueryInterface( Marshal.GetIUnknownForObject(objTask), ref IID_IPersistFile, out pPersistFile); objPersistFile = (IPersistFile)Marshal.GetObjectForIUnknown(pPersistFile); objPersistFile.Save(null, true); } catch (Exception ex) { throw ex; } finally { // COMオブジェクト解放 ReleaseComObject(); } } // 毎日、3時間に1回、実行するタスク・スケジューラの作成 public void Test3() { try { // タスク作成(タスク名) objTaskScheduler = (ITaskScheduler)CoCreateInstance( CLSID_CTaskScheduler, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_ITaskScheduler); objTask = (ITask)objTaskScheduler.NewWorkItem("TaskName3", CLSID_CTask, IID_ITask); // 実行プログラム設定 objTask.SetApplicationName("notepad.exe"); // 実行アカウント名とパスワード設定 objTask.SetAccountInformation("user", "password"); // トリガー作成 short iNewTrigger; objTaskTrigger = (ITaskTrigger)objTask.CreateTrigger(out iNewTrigger); // スケジュール設定------------------------------------------------------ TASK_TRIGGER pTrigger = new TASK_TRIGGER(); pTrigger.cbTriggerSize = (short)Marshal.SizeOf(pTrigger); pTrigger.wBeginYear = 2100; // 2100年 pTrigger.wBeginMonth = 12; // 12月 pTrigger.wBeginDay = 31; // 31日 pTrigger.wStartHour = 17; // 17時 pTrigger.wStartMinute = 30; // 30分 pTrigger.MinutesDuration = 24 * 60; // 24時間継続 pTrigger.MinutesInterval = 3 * 60; // 03時間間隔 pTrigger.Type.Daily.DaysInterval = 1; // 1日に1回 pTrigger.TriggerType = TASK_TRIGGER_TYPE.TASK_TIME_TRIGGER_DAILY; objTaskTrigger.SetTrigger(ref pTrigger); // ---------------------------------------------------------------------- // タスク保存 IntPtr pPersistFile = IntPtr.Zero; Guid IID_IPersistFile = Marshal.GenerateGuidForType(typeof(IPersistFile)); Marshal.QueryInterface( Marshal.GetIUnknownForObject(objTask), ref IID_IPersistFile, out pPersistFile); objPersistFile = (IPersistFile)Marshal.GetObjectForIUnknown(pPersistFile); objPersistFile.Save(null, true); } catch (Exception ex) { throw ex; } finally { // COMオブジェクト解放 ReleaseComObject(); } } // 毎週、月水金曜日に実行するタスク・スケジューラの作成 public void Test4() { try { // タスク作成(タスク名) objTaskScheduler = (ITaskScheduler)CoCreateInstance( CLSID_CTaskScheduler, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_ITaskScheduler); objTask = (ITask)objTaskScheduler.NewWorkItem("TaskName4", CLSID_CTask, IID_ITask); // 実行プログラム設定 objTask.SetApplicationName("notepad.exe"); // 実行アカウント名とパスワード設定 objTask.SetAccountInformation("user", "password"); // トリガー作成 short iNewTrigger; objTaskTrigger = (ITaskTrigger)objTask.CreateTrigger(out iNewTrigger); // スケジュール設定------------------------------------------------------ TASK_TRIGGER pTrigger = new TASK_TRIGGER(); pTrigger.cbTriggerSize = (short)Marshal.SizeOf(pTrigger); pTrigger.wBeginYear = 2100; // 2100年 pTrigger.wBeginMonth = 12; // 12月 pTrigger.wBeginDay = 31; // 31日 pTrigger.wStartHour = 17; // 17時 pTrigger.wStartMinute = 30; // 30分 pTrigger.Type.Weekly.WeeksInterval = 1; // 1週に1回 pTrigger.Type.Weekly.rgfDaysOfTheWeek = 2 + 8 + 32; // 月水金曜日 pTrigger.TriggerType = TASK_TRIGGER_TYPE.TASK_TIME_TRIGGER_WEEKLY; objTaskTrigger.SetTrigger(ref pTrigger); // ---------------------------------------------------------------------- // タスク保存 IntPtr pPersistFile = IntPtr.Zero; Guid IID_IPersistFile = Marshal.GenerateGuidForType(typeof(IPersistFile)); Marshal.QueryInterface( Marshal.GetIUnknownForObject(objTask), ref IID_IPersistFile, out pPersistFile); objPersistFile = (IPersistFile)Marshal.GetObjectForIUnknown(pPersistFile); objPersistFile.Save(null, true); } catch (Exception ex) { throw ex; } finally { // COMオブジェクト解放 ReleaseComObject(); } } // 毎月、15日に実行するタスク・スケジューラの作成 public void Test5() { try { // タスク作成(タスク名) objTaskScheduler = (ITaskScheduler)CoCreateInstance( CLSID_CTaskScheduler, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_ITaskScheduler); objTask = (ITask)objTaskScheduler.NewWorkItem("TaskName5", CLSID_CTask, IID_ITask); // 実行プログラム設定 objTask.SetApplicationName("notepad.exe"); // 実行アカウント名とパスワード設定 objTask.SetAccountInformation("user", "password"); // トリガー作成 short iNewTrigger; objTaskTrigger = (ITaskTrigger)objTask.CreateTrigger(out iNewTrigger); // スケジュール設定------------------------------------------------------ TASK_TRIGGER pTrigger = new TASK_TRIGGER(); pTrigger.cbTriggerSize = (short)Marshal.SizeOf(pTrigger); pTrigger.wBeginYear = 2100; // 2100年 pTrigger.wBeginMonth = 12; // 12月 pTrigger.wBeginDay = 31; // 31日 pTrigger.wStartHour = 17; // 17時 pTrigger.wStartMinute = 30; // 30分 pTrigger.Type.MonthlyDate.rgfMonths = 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048; // 1,2,3,4,5,6,7,8,9,10,11,12月 pTrigger.Type.MonthlyDate.rgfDays = (int)Math.Pow(2, 15 - 1); // 15日 pTrigger.TriggerType = TASK_TRIGGER_TYPE.TASK_TIME_TRIGGER_MONTHLYDATE; objTaskTrigger.SetTrigger(ref pTrigger); // ---------------------------------------------------------------------- // タスク保存 IntPtr pPersistFile = IntPtr.Zero; Guid IID_IPersistFile = Marshal.GenerateGuidForType(typeof(IPersistFile)); Marshal.QueryInterface( Marshal.GetIUnknownForObject(objTask), ref IID_IPersistFile, out pPersistFile); objPersistFile = (IPersistFile)Marshal.GetObjectForIUnknown(pPersistFile); objPersistFile.Save(null, true); } catch (Exception ex) { throw ex; } finally { // COMオブジェクト解放 ReleaseComObject(); } } // 毎月、第2木曜日に実行するタスク・スケジューラの作成 public void Test6() { try { // タスク作成(タスク名) objTaskScheduler = (ITaskScheduler)CoCreateInstance( CLSID_CTaskScheduler, null, CLSCTX.CLSCTX_INPROC_SERVER, IID_ITaskScheduler); objTask = (ITask)objTaskScheduler.NewWorkItem("TaskName6", CLSID_CTask, IID_ITask); // 実行プログラム設定 objTask.SetApplicationName("notepad.exe"); // 実行アカウント名とパスワード設定 objTask.SetAccountInformation("user", "password"); // トリガー作成 short iNewTrigger; objTaskTrigger = (ITaskTrigger)objTask.CreateTrigger(out iNewTrigger); // スケジュール設定------------------------------------------------------ TASK_TRIGGER pTrigger = new TASK_TRIGGER(); pTrigger.cbTriggerSize = (short)Marshal.SizeOf(pTrigger); pTrigger.wBeginYear = 2100; // 2100年 pTrigger.wBeginMonth = 12; // 12月 pTrigger.wBeginDay = 31; // 31日 pTrigger.wStartHour = 17; // 17時 pTrigger.wStartMinute = 30; // 30分 pTrigger.Type.MonthlyDOW.rgfMonths = 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048; // 1,2,3,4,5,6,7,8,9,10,11,12月 pTrigger.Type.MonthlyDOW.wWhichWeek = 2; // 第2週 pTrigger.Type.MonthlyDOW.rgfDaysOfTheWeek = 16; // 木曜日 pTrigger.TriggerType = TASK_TRIGGER_TYPE.TASK_TIME_TRIGGER_MONTHLYDOW; objTaskTrigger.SetTrigger(ref pTrigger); // ---------------------------------------------------------------------- // タスク保存 IntPtr pPersistFile = IntPtr.Zero; Guid IID_IPersistFile = Marshal.GenerateGuidForType(typeof(IPersistFile)); Marshal.QueryInterface( Marshal.GetIUnknownForObject(objTask), ref IID_IPersistFile, out pPersistFile); objPersistFile = (IPersistFile)Marshal.GetObjectForIUnknown(pPersistFile); objPersistFile.Save(null, true); } catch (Exception ex) { throw ex; } finally { // COMオブジェクト解放 ReleaseComObject(); } } /// <summary> /// COMオブジェクト解放 /// </summary> /// <returns></returns> private void ReleaseComObject() { try { if (objPersistFile != null) { Marshal.ReleaseComObject(objPersistFile); objPersistFile = null; } } catch { } try { if (objTaskTrigger != null) { Marshal.ReleaseComObject(objTaskTrigger); objTaskTrigger = null; } } catch { } try { if (objTask != null) { Marshal.ReleaseComObject(objTask); objTask = null; } } catch { } try { if (objTaskScheduler != null) { Marshal.ReleaseComObject(objTaskScheduler); objTaskScheduler = null; } } catch { } } /// <summary> /// デストラクタ /// </summary> ~Class1() { // COMオブジェクト解放 ReleaseComObject(); } } ★テスト用フォーム(Form1.cs) public partial class Form1 : Form { // 1回だけ実行するタスク・スケジューラの作成 private void Button1_Click(object sender, EventArgs e) { Class1 obj =new Class1(); obj.Test1(); } // 毎日(または2日に)、1回だけ実行するタスク・スケジューラの作成 private void Button2_Click(object sender, EventArgs e) { Class1 obj = new Class1(); obj.Test2(); } // 毎日、3時間に1回、実行するタスク・スケジューラの作成 private void Button3_Click(object sender, EventArgs e) { Class1 obj = new Class1(); obj.Test3(); } // 毎週、月水金曜日に実行するタスク・スケジューラの作成 private void Button4_Click(object sender, EventArgs e) { Class1 obj = new Class1(); obj.Test4(); } // 毎月、15日に実行するタスク・スケジューラの作成 private void Button5_Click(object sender, EventArgs e) { Class1 obj = new Class1(); obj.Test5(); } // 毎月、第2木曜日に実行するタスク・スケジューラの作成 private void Button6_Click(object sender, EventArgs e) { Class1 obj = new Class1(); obj.Test6(); } } |