Guest User

Untitled

a guest
Jan 21st, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. #include <cstring>
  2. #include <type_traits>
  3. #if __cplusplus >= 201103L
  4. # include <cassert>
  5. #else
  6. # define static_assert(cond, text)
  7. #endif
  8.  
  9. template<
  10. class D, class S,
  11. class = std::enable_if<std::is_pointer<S>::value && std::is_pointer<S>::value>::type
  12. >
  13. static D convert(S in)
  14. {
  15. D out;
  16. static_assert(sizeof(in) == sizeof(out));
  17. memcpy(&out, &in, sizeof(in));
  18. return out;
  19. }
  20.  
  21. #include <windows.h>
  22.  
  23. int main()
  24. {
  25. // Вместо "mymsg" подставьте своё название, например, "имя-программы.on_idle"
  26. const UINT uMsgId = RegisterWindowMessage(TEXT("mymsg"));
  27. SendMessage(HWND_BROADCAST, RegisterWindowMessage, 0, 0);
  28. return 0;
  29. }
  30.  
  31. #include <windows.h>
  32. #include <mstask.h>
  33. #include <objidl.h>
  34.  
  35. // ...
  36.  
  37. ITaskScheduler *scheduler;
  38. const HRESULT lComStartupResult = CoCreateInstance(
  39. /* rclsid */ CLSID_CTaskScheduler, // Класс планировщика задач
  40. /* pUnkOuter */ NULL,
  41. /* dwClsContext */ CLSCTX_INPROC_SERVER, // Загружаем mstask.dll в наш процесс
  42. /* riid */ IID_ITaskScheduler, // Нас интересует конкретный интерфейс
  43. /* ppv */ convert<void**>(&scheduler)
  44. );
  45. if(SUCCEEDED(lComStartupResult))
  46. {
  47. // Создаём задачу, выполняемую при бездействии.
  48. LPCWSTR pwszTaskName;
  49. ITask *task;
  50. const HRESULT lTaskAdditionResult = scheduler->NewWorkItem(
  51. /* pwszTaskName */ L"MyTask", // Подставьте сюда осмысленное имя задачи
  52. /* rclsid */ CLSID_CTask,
  53. /* riid */ IID_ITask,
  54. /* ppunk */ convert<void**>(&task)
  55. );
  56. if(SUCCEEDED(lTaskAdditionResult))
  57. {
  58. // Указываем, что задача должна исполняться сразу же при обнаружении простоя.
  59. // В каждой версии Windows свои критерии наступления этого события:
  60. //
  61. // * Windows Vista ждёт десять минут с момента прекращения пользования
  62. // клавиатурой и мышью.
  63. // * Windows 7 и выше ждёт уже четыре минуты.
  64. TASK_TRIGGER triggerInfo;
  65. memset(&triggerInfo, 0, sizeof(triggerInfo));
  66. rTrigger.cbTriggerSize = sizeof(triggerInfo);
  67. rTrigger.TriggerType = TASK_EVENT_TRIGGER_ON_IDLE;
  68.  
  69. // Создаём триггер с указанными параметрами
  70. WORD triggerId; // Параметр помечен как [out], поэтому инициализация не требуется
  71. ITaskTrigger *trigger;
  72. const HRESULT lTriggerAdditionResult = pITask->CreateTrigger(
  73. /* piNewTrigger */ &triggerId,
  74. /* ppTrigger */ &trigger
  75. );
  76. if(SUCCEEDED(lTriggerAdditionResult))
  77. {
  78. trigger->SetTrigger(&triggerInfo);
  79.  
  80. // Указываем программу, которая будет запущена при бездействии. Она, в свою
  81. // очередь, должна будет послать вам уведомление (как именно - см. выше)
  82. // и завершиться
  83. trigger->SetProgram(L"путь до программы");
  84. trigger->SetComment(L"описание задачи для администратора, что и зачем делает");
  85.  
  86. // Сохраняем задачу в Планировщик задач
  87. IPersistFile *saver;
  88. const HRESULT lSaverRetrieved = trigger->QueryInterface(
  89. /* riid */ IID_IPersistFile,
  90. /* ppvObject */ convert<void**>(&saver)
  91. );
  92. if(SUCCEEDED(lSaverRetrieved))
  93. {
  94. saver->Save(/* pszFileName */ NULL, /* fRemember */ FALSE);
  95. saver->Release();
  96. }
  97.  
  98. trigger->Release();
  99. }
  100. else
  101. {
  102. // Ошибка при добавлении триггера
  103. }
  104.  
  105. task->Release();
  106. }
  107. else
  108. {
  109. // Ошибка при создании задачи
  110. }
  111.  
  112. scheduler->Release();
Add Comment
Please, Sign In to add comment