2009-12-18 58 views
1

我寫的是可以通過其他服務進行加載的程序(我們的控制之下),或者通過登錄的用戶。該程序需要知道窗口站是否交互以顯示對話框。我知道GetProcessWindowStation函數,但是這個返回一個句柄。有沒有辦法找出答案?如何知道所連接的windowstation是否互動?

回答

5

交互式窗口站總是winsta0。所以你需要獲得窗口站名來確定它。下面是一些僞代碼:

wchar_t buffer[256] = {0}; 
DWORD length = 0; 
GetUserObjectInformation(GetProcessWindowStation(), UOI_NAME, buffer, 256, &length); 
if (!lstrcmp(buffer, "winsta0")) { 
    // Interactive! 
} 

http://msdn.microsoft.com/en-us/library/ms687096(VS.85).aspx

交互式窗口站,Winsta0,是唯一的窗口站,可以顯示的用戶接口或接收用戶輸入

+1

偉大的答案。一個警告 - 我得到的窗口站是「WinSta0」。字符串比較函數需要是lstrcmpi。 – cuteCAT 2009-12-18 20:20:52

0

我建議讓服務傳遞命令行參數,讓程序知道它是由服務而不是用戶啓動的。

0

請注意,這僅適用於Windows XP(然後只是偶爾) - 在Windows Vista和超越,從交互用戶單獨的會話中運行的服務,所以你永遠無法連接到控制檯上的那些操作系統。

此外在Windows XP中,你的應用程序不會,如果有機器(快速用戶切換),多用戶,因爲只有第一個用戶登錄到會話0(其中服務運行)工作。

你會好得多分裂您的服務分爲兩個部分 - 它做的工作和一小塊的代碼運行的任務(使用Win32任務調度程序的API)服務運行的UI。

相關問題