1日中オフの状態でRDPを介してPC(Windows XP Pro、24時間年中無休で実行)に接続します。RDP接続時にいくつかのことを実行する必要があるバックグラウンドプロセスがありますが、RDP接続の確立を検出する方法を見つけることができませんでした。
新しいプロセスは作成されません。WTSQuerySessionInformationは役に立ちません(同じ永遠のWindowsセッションに接続します)。
1日中オフの状態でRDPを介してPC(Windows XP Pro、24時間年中無休で実行)に接続します。RDP接続時にいくつかのことを実行する必要があるバックグラウンドプロセスがありますが、RDP接続の確立を検出する方法を見つけることができませんでした。
新しいプロセスは作成されません。WTSQuerySessionInformationは役に立ちません(同じ永遠のWindowsセッションに接続します)。
答えはwtsapi32.dllWTSRegisterSessionNotification()
からです。
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