2009-12-18 56 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。

相关问题