Guest User

Untitled

a guest
Jan 21st, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 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), "incompatible pointer types");
  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, uMsgId, 0, 0);
  28. return 0;
  29. }
  30.  
  31. // Где-нибудь во время создания окна инициализируйте эту переменную вызовом
  32. // uMsgId = RegisterWindowMessage(TEXT("название-указанное-выше"));
  33. INT uIdleNotificationMsgId;
  34.  
  35. // Обработчик оконных сообщений
  36. LRESULT CALLBACK WindowProc(
  37. HWND hwnd,
  38. UINT uMsg,
  39. WPARAM wParam,
  40. LPARAM lParam
  41. )
  42. {
  43. switch(uMsg)
  44. {
  45. // Здесь вы обрабатываете все обычные оконные сообщения
  46.  
  47. default:
  48. if(uMsg == uIdleNotificationMsgId)
  49. {
  50. // Обнаружено бездействие. Выполняете действия, которые хотели
  51.  
  52. return 0;
  53. }
  54. else
  55. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  56. }
  57. }
  58.  
  59. #include <windows.h>
  60. #include <mstask.h>
  61. #include <objidl.h>
  62.  
  63. // ...
  64.  
  65. ITaskScheduler *scheduler;
  66. const HRESULT lComStartupResult = CoCreateInstance(
  67. /* rclsid */ CLSID_CTaskScheduler, // Класс планировщика задач
  68. /* pUnkOuter */ NULL,
  69. /* dwClsContext */ CLSCTX_INPROC_SERVER, // Загружаем mstask.dll в наш процесс
  70. /* riid */ IID_ITaskScheduler, // Нас интересует конкретный интерфейс
  71. /* ppv */ convert<void**>(&scheduler)
  72. );
  73. if(SUCCEEDED(lComStartupResult))
  74. {
  75. // Создаём задачу, выполняемую при бездействии.
  76. LPCWSTR pwszTaskName;
  77. ITask *task;
  78. const HRESULT lTaskAdditionResult = scheduler->NewWorkItem(
  79. /* pwszTaskName */ L"MyTask", // Подставьте сюда осмысленное имя задачи
  80. /* rclsid */ CLSID_CTask,
  81. /* riid */ IID_ITask,
  82. /* ppunk */ convert<void**>(&task)
  83. );
  84. if(SUCCEEDED(lTaskAdditionResult))
  85. {
  86. // Указываем, что задача должна исполняться сразу же при обнаружении простоя.
  87. // В каждой версии Windows свои критерии наступления этого события:
  88. //
  89. // * Windows Vista ждёт десять минут с момента прекращения пользования
  90. // клавиатурой и мышью.
  91. // * Windows 7 и выше ждёт уже четыре минуты.
  92. TASK_TRIGGER triggerInfo;
  93. memset(&triggerInfo, 0, sizeof(triggerInfo));
  94. rTrigger.cbTriggerSize = sizeof(triggerInfo);
  95. rTrigger.TriggerType = TASK_EVENT_TRIGGER_ON_IDLE;
  96.  
  97. // Создаём триггер с указанными параметрами
  98. WORD triggerId; // Параметр помечен как [out], поэтому инициализация не требуется
  99. ITaskTrigger *trigger;
  100. const HRESULT lTriggerAdditionResult = pITask->CreateTrigger(
  101. /* piNewTrigger */ &triggerId,
  102. /* ppTrigger */ &trigger
  103. );
  104. if(SUCCEEDED(lTriggerAdditionResult))
  105. {
  106. trigger->SetTrigger(&triggerInfo);
  107.  
  108. // Указываем программу, которая будет запущена при бездействии. Она, в свою
  109. // очередь, должна будет послать вам уведомление (как именно - см. выше)
  110. // и завершиться
  111. trigger->SetProgram(L"путь до программы");
  112. trigger->SetComment(L"описание задачи для администратора, что и зачем делает");
  113.  
  114. // Сохраняем задачу в Планировщик задач
  115. IPersistFile *saver;
  116. const HRESULT lSaverRetrieved = trigger->QueryInterface(
  117. /* riid */ IID_IPersistFile,
  118. /* ppvObject */ convert<void**>(&saver)
  119. );
  120. if(SUCCEEDED(lSaverRetrieved))
  121. {
  122. saver->Save(/* pszFileName */ NULL, /* fRemember */ FALSE);
  123. saver->Release();
  124. }
  125.  
  126. trigger->Release();
  127. }
  128. else
  129. {
  130. // Ошибка при добавлении триггера
  131. }
  132.  
  133. task->Release();
  134. }
  135. else
  136. {
  137. // Ошибка при создании задачи
  138. }
  139.  
  140. scheduler->Release();
Add Comment
Please, Sign In to add comment