2008-09-17 3 views
2

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

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

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

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

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

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

ответ

3

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

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; 
    } 
} 

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

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

1

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

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

0

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