Можно ли использовать планировщик заданий Windows 7 в собственном приложении? - PullRequest
2 голосов
/ 29 июля 2010

Я разрабатываю приложение на основе дополнений.Каждое дополнение использует планировщик.Загружено дополнение по расписанию.Мое приложение запускает только один экземпляр.Иногда приложение закрыто, иногда работает.Поэтому мне нужно использовать планировщик задач Windows 7

Как использовать планировщик задач в собственном приложении?

Мне нужно создать новую задачу из приложенияМне нужно это, когда задача завершена, отправить сообщение в мое приложение или вызвать любую функцию моего приложенияЯвляется ли это возможным?Как это сделать?

Ответы [ 3 ]

5 голосов
/ 29 июля 2010

Если вы хотите взаимодействовать с системой запланированных задач Windows 7 из своего кода для создания, управления или удаления задачи, которая не вызывает проблем.(Я расскажу об этом в курсе по Windows 7, который я написал для Pluralsight.) Добавьте ссылку на COM в TaskScheduler, и вы затем выполните следующие действия:

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);

В этом конкретном примере выполняется исполняемый файл, который находится в том жерешение (другой проект).Вам необходимо настроить Action.Path, Action.WorkingDirectory и т. Д. В соответствии с вашими потребностями.

5 голосов
/ 29 июля 2010
0 голосов
/ 15 ноября 2012

Спасибо за отличный пример, Кейт, я сожалею, что в своих странствиях я не наткнулся на твой код первым.

У меня был веселый танец с регистрацией запланированных заданий с помощью кода C #, и неудивительно, что мне пришлось настроить свой код создания расписания, поскольку я сталкиваюсь с препятствиями в одной среде, с которой я ранее не сталкивался. Я надеюсь, что пришел к самому надежному коду и подумал, что он также может быть полезен для других, если я поделюсь некоторыми вещами, которые вы могли бы попробовать, столкнувшись с проблемами окружающей среды:

  • Укажите путь к исполняемому файлу в двойных кавычках
  • Не помещать рабочую папку в кавычки
  • Как только задача создана, если вы вносите последующие изменения, вызывайте ask.RegisterChanges (); - может быть стоит установить task.Definition.Principal.RunLevel = TaskRunLevel.Highest;
  • Обычно для запуска задачи я обычно использую системную учетную запись, но в некоторых сетевых средах у меня возникали проблемы, которые я не смог понять, но смог решить, предоставив учетную запись пользователя для запуска задачи.

всего наилучшего Matt

...