Я работаю над личным проектом по настройке моей DIY Ambilight ( Github repo ).Таким образом, программа все время выполняет серию команд и отправляет их на внешнюю плату Arduino, которая затем обрабатывает все.Окончательное сообщение должно быть отправлено на доску, если пользователь, где заблокировать свой сеанс или даже выйти из системы.Проблема в том, что я не могу правильно обработать сообщение WM_WTSSESSION_CHANGE
.
На этом этапе может помочь любая помощь.Ambilight::pause
должен только временно остановить выполнение, тогда как Ambilight::stop
должен полностью завершить все.Я действительно не знаю, где должен вызываться метод Ambilight::stop
, так как это мой первый проект, использующий WinAPI.Мой алгоритм работает в отдельном потоке;Я думаю, может быть, это может быть проблемой.Вот упрощенный код, используемый для обработки всего:
main.cpp
// ... global initializations
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// ... other messages handling
case WM_WTSSESSION_CHANGE:
// this case doesn't seem to work properly
switch (wParam)
{
case WTS_SESSION_UNLOCK:
ambilight.start();
break;
case WTS_SESSION_LOCK:
ambilight.pause();
break;
case WTS_SESSION_LOGOFF:
ambilight.stop();
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
// ... hWnd Creation
WTSRegisterSessionNotification(hWnd, NOTIFY_FOR_THIS_SESSION);
ambilight.start();
MSG message;
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
ambilight.stop();
return (int)message.wParam;
}
Ambilight.cpp
#include "Ambilight.h"
Ambilight::Ambilight(const Options & options)
: isPaused(true),
isStopped(false),
thread(&Ambilight::exec, this, options)
{ }
Ambilight::~Ambilight()
{
this->stop();
}
void Ambilight::start()
{
this->isPaused = false;
}
void Ambilight::pause()
{
this->isPaused = true;
}
void Ambilight::stop()
{
this->pause();
this->isStopped = true;
if (this->thread.joinable())
{
this->thread.join();
}
}
void Ambilight::exec(const Options & options) const
{
// .. action initialization
bool hasFaded = false;
while (!this->isStopped)
{
while (!this->isPaused)
{
// ... recurring action
hasFaded = false;
}
if (!hasFaded)
{
// ... action that is supposed to be execute when user logs off
hasFaded = true;
}
}
}