C++ 测试Windows应用程序的运行条件

C++ 测试Windows应用程序的运行条件,c++,windows,command-line,C++,Windows,Command Line,我有几个应用程序,它们是我们工作室的不同开发人员使用的一套工具的一部分。这些应用程序主要是打开DOS命令shell的命令行应用程序。这些应用程序依次启动一个GUI应用程序,该应用程序跟踪这些命令行应用程序的输出和状态(通过套接字) 命令行应用程序可以在用户登录时启动,也可以在其工作站被锁定时启动(启动批处理文件,然后立即锁定其工作状态),也可以在用户注销时启动(通过计划任务)。我遇到的问题是最后两个案例 如果用户被锁定或注销时,这些应用程序中的任何一个都会触发,那么这些命令将生成跟踪输出/状态的

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

命令行应用程序可以在用户登录时启动,也可以在其工作站被锁定时启动(启动批处理文件,然后立即锁定其工作状态),也可以在用户注销时启动(通过计划任务)。我遇到的问题是最后两个案例

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

我要寻找的是一种从我的命令行应用程序中判断它们是在锁定的工作站后面运行还是在用户注销(通过预定任务)时运行的方法——基本上,它们是在用户的桌面不可见的情况下运行的。如果我可以这么说,那么我就不能启动GUI,可以避免很多问题

我需要测试的这些应用程序是C/C++Windows应用程序


我希望这是有意义的。

您可以使用SENS(系统事件通知服务)。我自己从来没有用过它,但我几乎肯定它会做你想做的事情:为你提供登录、注销、屏幕保护程序等事件的通知


我知道这很模糊,但希望它能让你开始。在谷歌的快速搜索中,我发现了这样一个问题:

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

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


链接到文档。

我已成功使用此方法检测桌面是否锁定在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);
}