测试Windows应用程序的运行状况
我有几个应用程序是我们工作室的各种开发人员使用的一套工具的一部分。这些应用程序主要是打开DOS cmd shell的命令行应用程序。这些应用程序反过来启动一个GUI应用程序,该应用程序跟踪这些命令行应用程序的输出和状态(通过套接字)。
命令行应用程序可以在用户登录,工作站被锁定(他们启动一个批处理文件然后立即锁定其工作场所)以及注销(通过计划任务)时启动。我遇到的问题与后两种情况有关。
如果在用户锁定或者注销时这些应用程序中的任何一个触发了,则这些命令将生成用于跟踪输出/状态的GUI窗口。很好,但是说用户的工作站已锁定-解锁工作站时,GUI不可见。它正在运行任务列表,但不可见。下次这些用户运行某些命令行应用程序时,不会启动GUI(因为它已经在运行),但是因为它在桌面上不可见,所以用户看不到任何输出。
我正在寻找一种从命令行应用程序中判断它们是否在锁定的工作站上运行或者何时注销(通过计划任务)的方法,基本上是在不可见用户桌面的情况下运行它们。如果可以告诉我,那么我就无法启动GUI,可以避免很多问题。
我需要测试的这些应用程序是C / C ++ Windows应用程序。
我希望这是有道理的。
解决方案
回答
我们也许可以使用SENS(系统事件通知服务)。我从未亲自使用过它,但是我几乎肯定它会做我们想要的事情:通知我们有关登录,注销,屏幕保护程序等事件。
我知道这很模糊,但希望它能入门。谷歌快速搜索发现了这一点,其中包括: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); }
回答
请查看Raymond Chen的本文("检测会话状态更改,例如锁定的工作站")。