Проблема обработки пользовательского выхода из WinAPI - PullRequest
0 голосов
/ 25 декабря 2018

Я работаю над личным проектом по настройке моей 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;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...