如何知道附加的windowstation是否是交互式的?

时间:2009-12-18 19:52:48

标签: c++ windows winapi

我正在编写一个程序,可以由另一个服务(在我们的控制下)或登录用户加载。程序需要知道窗口站是否是交互式的,以便显示对话框。我知道GetProcessWindowStation函数,但是这个函数返回一个句柄。有没有办法找出来?

3 个答案:

答案 0 :(得分: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 :(得分:0)

我建议使用服务传递命令行参数,让程序知道它是由服务而不是用户启动的。

答案 2 :(得分:0)

请注意,这仅适用于Windows XP(有时仅适用于此版本) - 在Windows Vista及更高版本中,服务在交互式用户的单独会话中运行,因此您永远无法连接到这些操作系统上的控制台

此外,在Windows XP上,如果计算机上有多个用户(快速用户切换),则应用程序将无法运行,因为只有第一个用户登录到会话0(服务运行的位置)。

将服务拆分为两部分会更好 - 实现工作的服务和运行UI的任务(使用Win32任务调度程序API)运行的一小段代码。