确定程序是否在远程桌面上运行
时间:2020-03-06 14:59:59 来源:igfitidea点击:
我的程序有什么方法可以确定它何时在远程桌面(终端服务)上运行?
我想在远程桌面会话上运行该程序时启用"不活动超时"。由于臭名昭著的原因是用户未打开远程桌面会话,因此我希望程序在指定的不活动时间后终止。但是,我不希望为非RD用户启用不活动超时。
解决方案
GetSystemMetrics(SM_REMOTESESSION)(如http://msdn.microsoft.com/en-us/library/aa380798.aspx中所述)
这是我使用的托管代码:
/// <summary> /// Indicates if we're running in a remote desktop session. /// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes! /// /// </summary> /// <returns></returns> public static Boolean IsRemoteSession { //This is just a friendly wrapper around the built-in way get { return System.Windows.Forms.SystemInformation.TerminalServerSession; } }
如果我们想了解会话中正在运行的应用程序,则可以使用以下方法:
BOOL IsRemoteSession(void) { return GetSystemMetrics( SM_REMOTESESSION ); }
但通常不提供任何进程ID。
如果我们想了解可以在任意会话中运行的任意进程,则可以使用以下方法。
我们可以先通过调用ProcessIdToSessionId将进程ID转换为会话ID。获得会话ID后,我们可以使用它来调用:WTSQuerySessionInformation。我们可以将WTSInfoClass指定为值WTSIsRemoteSession,这将为我们提供有关该应用程序是否为远程桌面连接的信息。
BOOL IsRemoteSession(DWORD sessionID) { //In case WTSIsRemoteSession is not defined for you it is value 29 return WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionID, WTSIsRemoteSession, NULL, NULL); }