2008-09-17 66 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); 
} 
相關問題