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





Возможно, вы сможете использовать 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);
}