Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstring>
- #include <type_traits>
- #if __cplusplus >= 201103L
- # include <cassert>
- #else
- # define static_assert(cond, text)
- #endif
- template<
- class D, class S,
- class = std::enable_if<std::is_pointer<S>::value && std::is_pointer<S>::value>::type
- >
- static D convert(S in)
- {
- D out;
- static_assert(sizeof(in) == sizeof(out));
- memcpy(&out, &in, sizeof(in));
- return out;
- }
- #include <windows.h>
- int main()
- {
- // Вместо "mymsg" подставьте своё название, например, "имя-программы.on_idle"
- const UINT uMsgId = RegisterWindowMessage(TEXT("mymsg"));
- SendMessage(HWND_BROADCAST, RegisterWindowMessage, 0, 0);
- return 0;
- }
- #include <windows.h>
- #include <mstask.h>
- #include <objidl.h>
- // ...
- ITaskScheduler *scheduler;
- const HRESULT lComStartupResult = CoCreateInstance(
- /* rclsid */ CLSID_CTaskScheduler, // Класс планировщика задач
- /* pUnkOuter */ NULL,
- /* dwClsContext */ CLSCTX_INPROC_SERVER, // Загружаем mstask.dll в наш процесс
- /* riid */ IID_ITaskScheduler, // Нас интересует конкретный интерфейс
- /* ppv */ convert<void**>(&scheduler)
- );
- if(SUCCEEDED(lComStartupResult))
- {
- // Создаём задачу, выполняемую при бездействии.
- LPCWSTR pwszTaskName;
- ITask *task;
- const HRESULT lTaskAdditionResult = scheduler->NewWorkItem(
- /* pwszTaskName */ L"MyTask", // Подставьте сюда осмысленное имя задачи
- /* rclsid */ CLSID_CTask,
- /* riid */ IID_ITask,
- /* ppunk */ convert<void**>(&task)
- );
- if(SUCCEEDED(lTaskAdditionResult))
- {
- // Указываем, что задача должна исполняться сразу же при обнаружении простоя.
- // В каждой версии Windows свои критерии наступления этого события:
- //
- // * Windows Vista ждёт десять минут с момента прекращения пользования
- // клавиатурой и мышью.
- // * Windows 7 и выше ждёт уже четыре минуты.
- TASK_TRIGGER triggerInfo;
- memset(&triggerInfo, 0, sizeof(triggerInfo));
- rTrigger.cbTriggerSize = sizeof(triggerInfo);
- rTrigger.TriggerType = TASK_EVENT_TRIGGER_ON_IDLE;
- // Создаём триггер с указанными параметрами
- WORD triggerId; // Параметр помечен как [out], поэтому инициализация не требуется
- ITaskTrigger *trigger;
- const HRESULT lTriggerAdditionResult = pITask->CreateTrigger(
- /* piNewTrigger */ &triggerId,
- /* ppTrigger */ &trigger
- );
- if(SUCCEEDED(lTriggerAdditionResult))
- {
- trigger->SetTrigger(&triggerInfo);
- // Указываем программу, которая будет запущена при бездействии. Она, в свою
- // очередь, должна будет послать вам уведомление (как именно - см. выше)
- // и завершиться
- trigger->SetProgram(L"путь до программы");
- trigger->SetComment(L"описание задачи для администратора, что и зачем делает");
- // Сохраняем задачу в Планировщик задач
- IPersistFile *saver;
- const HRESULT lSaverRetrieved = trigger->QueryInterface(
- /* riid */ IID_IPersistFile,
- /* ppvObject */ convert<void**>(&saver)
- );
- if(SUCCEEDED(lSaverRetrieved))
- {
- saver->Save(/* pszFileName */ NULL, /* fRemember */ FALSE);
- saver->Release();
- }
- trigger->Release();
- }
- else
- {
- // Ошибка при добавлении триггера
- }
- task->Release();
- }
- else
- {
- // Ошибка при создании задачи
- }
- scheduler->Release();
Add Comment
Please, Sign In to add comment