testingWindows应用程序的运行状况

我有几个应用程序是我们工作室的各种开发人员使用的一套工具的一部分。 这些应用程序主要是打开DOS cmd shell的命令行应用程序。 这些应用程序反过来启动一个GUI应用程序,跟踪这些命令行应用程序的输出和状态(通过套接字)。

命令行应用程序可以在用户login时启动,当他们的工作站被locking(他们触发一个batch file,然后立即locking他们的工作),并当他们注销(通过计划的任务)。 我所遇到的问题是最后两种情况。

如果这些应用程序中的任何一个在用户被locking或注销时触发,这些命令将产生跟踪输出/状态的GUI窗口。 这很好,但是说用户的工作站被locking – 当他们解锁工作站时,GUI不可见。 它正在运行任务列表,但不可见。 下一次这些用户运行一些命令行应用程序时,GUI不会启动(因为它已经在运行),但是由于在桌面上不可见,所以用户看不到任何输出。

我正在寻找的是从我的命令行应用程序中分辨出是否在locking的工作站后面运行或用户注销(通过计划的任务)的方式 – 基本上它们在没有用户桌面的情况下运行。 如果我可以说,那么我可以简单地启动我们的GUI,并可以防止很多问题。

我需要testing的这些应用程序是C / C ++ Windows应用程序。

我希望这是有道理的。

Solutions Collecting From Web of "testingWindows应用程序的运行状况"

我找到了我正在寻找的程序化答案。 它与车站有关。 显然,桌面上运行的任何东西都会在具有特定名称的电台上运行。 任何不在桌面上(即任务管理器在注销或锁定的工作站上启动的进程)都将以不同的站名开始。 示例代码:

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。

链接到这里的文档。

您可能能够使用SENS(系统事件通知服务)。 我从来没有使用过它,但我几乎积极,它会做你想做的:给你通知登录,注销,屏幕保护程序等事件。

我知道这非常含糊,但希望它会让你开始。 快速谷歌搜索出现了这一点,其中包括: http : //discoveringdotnet.alexeyev.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); } 

请阅读Raymond Chen的文章(“检测会话状态更改,如锁定的工作站”) 。