是否可以在自己的应用程序中使用Windows 7任务计划程序

时间:2010-07-29 04:03:27

标签: c# windows-7 windows-services scheduling task

我正在开发基于附加组件的应用程序。每个附加组件都使用调度程序。加载的附加计划任务。我的应用程序只运行一个实例。应用程序关闭,有时运行。因此,我需要使用Windows 7任务计划程序

如何在自己的应用程序上使用任务调度程序?

我需要从申请中创建新任务
我需要在任务完成时,将消息发送到我的应用程序或调用我的应用程序的任何功能
有可能吗?
怎么做?

3 个答案:

答案 0 :(得分:5)

在CodeProject查看此项目。

A New Task Scheduler Class Library for .NET

答案 1 :(得分:5)

如果要从代码中与Windows 7计划任务系统进行交互,以创建,管理或删除没有问题的任务。 (我在为Pluralsight编写的Windows 7课程中介绍了这一点。)向TaskScheduler添加一个COM引用然后你做了这样的事情:

ITaskService scheduler = new TaskSchedulerClass();
scheduler.Connect(null, null, null, null);

ITaskFolder rootFolder = scheduler.GetFolder("\\");
ITaskFolder folder = rootFolder.GetFolders(0).Cast<ITaskFolder>().FirstOrDefault(
    f => f.Name == "Windows7Course");

if (folder == null)
{
    folder = rootFolder.CreateFolder("Windows7Course", null);
}

ITaskDefinition task = scheduler.NewTask(0);
IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);

action.Path = typeof(SayHello.Form1).Assembly.Location;
action.WorkingDirectory = Path.GetDirectoryName(typeof(SayHello.Form1).Assembly.Location);

ISessionStateChangeTrigger trigger = (ISessionStateChangeTrigger)task.Triggers.Create(
    _TASK_TRIGGER_TYPE2.TASK_TRIGGER_SESSION_STATE_CHANGE);

trigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_SESSION_UNLOCK;

task.Settings.DisallowStartIfOnBatteries = true;

task.RegistrationInfo.Author = "Kate Gregory";
task.RegistrationInfo.Description = "Launches a greeting.";

IRegisteredTask ticket = folder.RegisterTaskDefinition(
    "GreetReturningUser", 
    task, 
    (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, 
    null, 
    null, 
    _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, 
    null);

此特定示例运行在同一解决方案(另一个项目)中的exe。您必须调整Action.Path,Action.WorkingDirectory等以满足您的需求。

答案 2 :(得分:0)

感谢凯特的优秀榜样,我觉得在我的游荡中我没有先遇到你的代码。

通过c#代码注册计划任务,我有一个愉快的舞蹈,毫不奇怪,我不得不调整我的计划创建代码,因为我遇到了一个以前没有遇到过的环境中的障碍。我希望我已经找到了最强大的代码,如果我遇到环境问题,如果我分享一些你可能会尝试的东西,那么它也可能对其他人有益:

  • 将路径放在双引号中的可执行文件
  • 不要将工作文件夹放在引号
  • 创建任务后,如果进行后续更改,请调用ask.RegisterChanges(); - 可能值得设置任务.Definition.Principal.RunLevel = TaskRunLevel.Highest;
  • 我通常默认使用系统帐户来运行任务,但在某些网络环境中,我遇到了一些我无法理解但能够通过提供用户帐户来解决的问题。
一切顺利 马特