检测RDP连接

时间:2012-08-28 18:16:44

标签: remote-desktop

我通过RDP连接到我的电脑(Windows XP Pro,全天24小时运行)。 我有一个后台进程,应该在RDP连接上做一些事情,但我无法想办法让它检测到RDP连接的建立。

没有创建新进程,WTSQuerySessionInformation无效(我连接到同一个永久的Windows会话)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

答案是来自wtsapi32.dll的WTSRegisterSessionNotification()。 这会让您注意接收WM_WTSSESSION_CHANGE通知,其WParam可能是WTS_REMOTE_CONNECT,WTS_REMOTE_DISCONNECT。就是这样。

这是最简单的AutoIt实现:

#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <WindowsConstants.au3>

Global Const $hWTSAPI32 = DllOpen("wtsapi32.dll")
Global $i = 0, $tTime

_Main()

Func _Main()
    Local $hGUI

    ; Create GUI
    $hGUI = GUICreate("Session change detection", 600, 400)
;~  GUISetState()  ; show the window

    DllCall($hWTSAPI32, "int", "WTSRegisterSessionNotification", "hwnd", $hGUI, "dword", 1) ; NOTIFY_FOR_ALL_SESSIONS
    If @error Then 
        MsgBox(0,"", "Error calling WTSRegisterSessionNotification()")
        Exit
    EndIf

    GUIRegisterMsg(0x2B1, "WTSSESSION_CHANGE")  ; WM_WTSSESSION_CHANGE <=====================

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

EndFunc   ;==>_Main

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func WTSSESSION_CHANGE($hWndGUI, $MsgID, $WParam, $LParam)
    ; WTS_REMOTE_CONNECT = 0x3, WTS_REMOTE_DISCONNECT = 0x4
    ; WTS_SESSION_UNLOCK = 0x8, WTS_SESSION_LOGON = 0x5
    If $WParam = 3 Then
        $tTime = _Date_Time_GetSystemTime()
        MsgBox(0, "Caught a notification", "Remote session connected at " & _Date_Time_SystemTimeToDateTimeStr($tTime) )
        Exit
    EndIf
EndFunc