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

StackOverflow https://stackoverflow.com/questions/87689

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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.

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

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

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

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

Я успешно использовал этот подход, чтобы определить, заблокирован ли рабочий стол в 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top