【问题标题】:Testing running condition of a Windows app测试 Windows 应用程序的运行状况
【发布时间】:2008-09-17 21:09:20
【问题描述】:

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

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

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

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

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

我希望这是有道理的。

【问题讨论】:

    标签: c++ windows command-line


    【解决方案1】:

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

    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】:

      您或许可以使用 SENS(系统事件通知服务)。我自己从未使用过它,但我几乎可以肯定它会做你想做的事:在登录、注销、屏幕保护程序等事件时通知你。

      我知道这很模糊,但希望它能帮助您入门。一个快速的谷歌搜索出现了这个,其中包括:http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-03-26
          • 2016-06-12
          • 2019-09-22
          • 2023-03-31
          • 2013-11-13
          • 1970-01-01
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多