在Windows Server 2003中,我如何检查我的程序是否在本地控制台(“在服务器计算机的屏幕上”)而不是远程会话中运行?
我正在使用Delphi Win32,因此任何基于Windows API的方法都应该可以工作..
答案 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,尽管没有使用快速用户切换。当然,这可能只是一个错误: - )