2008-09-17 71 views
2

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

命令行应用程序可以在用户登录时启动,他们的工作站被锁定(他们触发一个批处理文件,然后立即锁定他们的工作区),以及他们何时注销(通过计划任务) 。我遇到的问题是最后两种情况。

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

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

我需要测试的这些应用程序是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; 
    } 
} 

如果你得到了“如果”语句中,那么你的程序是不是在桌面上,但运行“别处”。当我不在桌面上运行时,我查看了名称缓冲区的值,名称没有多大意义,但它们不是WinSta0。

链接到文档here

1

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

我知道这很模糊,但希望它会让你开始。快速谷歌搜索出现了这一点,其中包括: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); 
} 
相关问题