Проверка работоспособности приложения Windows - PullRequest
2 голосов
/ 18 сентября 2008

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 18 сентября 2008

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

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, то ваш процесс не на рабочем столе, а работает «где-то еще». Я смотрел на значение namebuffer, когда он не запускается с рабочего стола, и имена ничего не значат, но они не WinSta0.

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

1 голос
/ 18 сентября 2008

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

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

0 голосов
/ 20 сентября 2008

Я успешно использовал этот подход, чтобы определить, заблокирован ли рабочий стол в 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...