代码之家  ›  专栏  ›  技术社区  ›  Mark

测试Windows应用程序的运行状态

  •  2
  • Mark  · 技术社区  · 16 年前

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

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

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

    我要寻找的是一种从我的命令行应用程序中辨别它们是否在锁定的工作站后面运行,或者当一个用户注销时(通过预定的任务),基本上它们是在没有用户桌面可见的情况下运行的。如果我能做到这一点,那么我就不能简单地启动我们的GUI,并且可以避免很多问题。

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

    我希望这是有道理的。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Mark    16 年前

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

    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。

    链接到文档 here .

        2
  •  1
  •   Adam Neal    16 年前

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

    我知道这很含糊,但希望它能让你开始。一个快速的谷歌搜索发现了这一点,其中包括: http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

        3
  •  0
  •   Andy Stevenson    16 年前

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