如何检查程序是否在本地控制台中运行?

时间:2008-10-28 18:50:41

标签: windows winapi console local

在Windows Server 2003中,我如何检查我的程序是否在本地控制台(“在服务器计算机的屏幕上”)而不是远程会话中运行?

我正在使用Delphi Win32,因此任何基于Windows API的方法都应该可以工作..

4 个答案:

答案 0 :(得分:2)

会话编号不会告诉你这个吗?

ProcessIdToSessionId(GetCurrentProcessId(),& dwSessionNum)

您还必须使用GetVersionEx检查操作系统版本:对于XP / Server 2003会话0的所有内容都是本地(服务或交互式控制台),更高的是虚拟的。对于Vista / 2008会话,0和1都是本地的(0是服务,1是控制台),其他一切都是虚拟的。

我猜你的Delphi单位会将会话号声明为var,所以你不需要&符号。

答案 1 :(得分:2)

WTSGetActiveConsoleSessionId()应该返回附加到控制台的会话的ID。然后,您可以将该会话ID与应用程序的当前会话ID进行比较,以确定您是否在控制台上运行。 Vista(不确定Windows Server 2008)不一定给控制台会话ID为1(快速用户切换,任何人?)。

答案 2 :(得分:2)

对我来说,ProcessIdToSessionId在直接在物理控制台上运行和登录管理会话时都返回0(mstsc / admin)。

但是,当您通过RDP登录时,Windows(在本例中为XP专业版)会创建一个新会话,该会话显示在物理控制台上,该控制台上只有“此计算机已锁定”显示。 WTSGetActiveConsoleSessionId返回第二个会话的会话ID,在我的情况下是2。

因此,即使您的应用程序在控制台上运行,现在有两个控制台会话,您的应用程序未在活动的应用程序上运行。在我的代码中,我将会话ID与0进行比较。

答案 3 :(得分:0)

Brian是正确的,我已经遇到Vista报告交互式控制台的会话ID为2,尽管没有使用快速用户切换。当然,这可能只是一个错误: - )