Тестирование рабочего состояния приложения Windows

У меня есть несколько приложений, которые являются частью набора инструментов, которые используют разные разработчики в нашей студии. эти приложения в основном являются приложениями командной строки, открывающими командную оболочку DOS. Эти приложения, в свою очередь, запускают приложение с графическим интерфейсом пользователя, которое отслеживает вывод и состояние (через сокеты) этих приложений командной строки.

Приложения командной строки можно запускать, когда пользователь вошел в систему, когда его рабочая станция заблокирована (они запускают пакетный файл, а затем сразу же блокируют свою рабочую станцию) и когда они выходят из системы (через запланированную задачу). Проблемы, которые у меня есть, связаны с двумя последними случаями.

Если какое-либо из этих приложений запускается, когда пользователь заблокирован или вышел из системы, эта команда вызовет окна графического интерфейса, которые отслеживают вывод / статус. Это нормально, но предположим, что пользователь заблокировал свою рабочую станцию ​​- когда он разблокирует свою рабочую станцию, графический интерфейс не отображается. Он выполняет список задач, но его не видно. В следующий раз, когда эти пользователи запустят некоторые из наших приложений командной строки, графический интерфейс не будет запущен (потому что он уже запущен), но поскольку он не отображается на рабочем столе, пользователи не видят никаких результатов.

Я ищу способ узнать из моих приложений командной строки, работают ли они за заблокированной рабочей станцией или когда пользователь вышел из системы (с помощью запланированной задачи) - в основном они работают без видимого рабочего стола пользователя. Если я могу это сказать, то я просто не могу запустить наш графический интерфейс и могу предотвратить множество проблем.

Эти приложения, которые мне нужно протестировать, являются приложениями Windows на C / C++.

Я надеюсь, что в этом есть смысл.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 758
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможно, вы сможете использовать SENS (службы уведомления о системных событиях). Я никогда не использовал его сам, но почти уверен, что он будет делать то, что вы хотите: уведомлять вас о таких событиях, как вход в систему, выход из системы, заставка и т. д.

Я знаю, что это довольно расплывчато, но, надеюсь, это поможет вам начать. Быстрый поиск в Google обнаружил это, среди прочего: http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

Ответ принят как подходящий

Я нашел программный ответ, который искал. Это связано со станциями. Очевидно, все, что запущено на рабочем столе, будет работать на станции с определенным именем. Все, что не находится на рабочем столе (например, процесс, запущенный диспетчером задач при выходе из системы или на заблокированной рабочей станции), будет запущен с другим именем станции. Пример кода:

HWINSTA dHandle = GetProcessWindowStation();
if ( GetUserObjectInformation(dHandle, UOI_NAME, nameBuffer, bufferLen, &lenNeeded) ) {
    if ( stricmp(nameBuffer, "winsta0") ) {
        // when we get here, we are not running on the real desktop
        return false;
   }
}

Если вы попадаете внутрь оператора if, значит, ваш процесс находится не на рабочем столе, а работает «где-то еще». Я посмотрел на значение буфера имен, когда он не запускался с рабочего стола, и имена мало что значат, но они не WinSta0.

Ссылка на документы здесь.

Я успешно использовал этот подход, чтобы определить, заблокирован ли рабочий стол в Windows:

bool isDesktopLocked = false;
HDESK inputDesktop = OpenInputDesktop(0, FALSE,
             DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
             DESKTOP_ENUMERATE |  DESKTOP_SWITCHDESKTOP |
             DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |
             DESKTOP_WRITE);

if (NULL == inputDesktop)
{
    isDesktopLocked = true;
}
else
{
    CloseDesktop(inputDesktop);
}

Другие вопросы по теме