- Offizieller Beitrag
Ich brauche mal eure Hilfe bei einer Funktion zum reagieren auf Benutzerwechsel, An-/Abmelden und Lock/Unlock.
Mein erster Versuch war das hier:
[autoit]
Global Const $WM_WTSSESSION_CHANGE = 0x02B1
GUIRegisterMsg($WM_WTSSESSION_CHANGE, 'ON_WM_WTSSESSION_CHANGE')
While 1
Sleep(50)
WEnd
Func ON_WM_WTSSESSION_CHANGE($hWndGUI, $MsgID, $WParam, $LParam)
ConsoleWrite(@HOUR&':'&@MIN&':'&@SEC&@CRLF)
EndFunc
Da tut sich aber nichts (sprich: die Funktion wird nie aufgerufen).
Nach ein bißchen rumgoogeln habe ich dann rausbekommen, dass man WTSRegisterSessionNotification registrieren muss, um diese Message auswerten zu können. Weiteres rumgoogeln brachte dann ein VB-Programm zu Tage:
Spoiler anzeigen
Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal MSG As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function WTSRegisterSessionNotificationA Lib "WtsApi32.dll" Alias _
"WTSRegisterSessionNotification" (ByVal hWnd As Long, ByVal dwFlags As Long) As Long
Public Declare Function WTSUnRegisterSessionNotificationA Lib "WtsApi32.dll" Alias _
"WTSUnRegisterSessionNotification" (ByVal hWnd As Long) As Long
Private Const GWL_WNDPROC As Long = -4&
Private Const WM_WTSSESSION_CHANGE As Long = &H2B1
Private Const WTS_SESSION_LOCK As Long = 7
Private Const WTS_SESSION_UNLOCK As Long = 8
Public Const WTS_SESSION_LOGON As Long = 5
Public Const WTS_SESSION_LOGOFF As Long = 6
Private Const NOTIFY_FOR_THIS_SESSION As Long = &H0
Private gHW As Long
Private lpPrevWndProc As Long
Public Sub Hook(hWnd As Long)
gHW = hWnd
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
Call WTSRegisterSessionNotificationA(hWnd, NOTIFY_FOR_ALL_SESSIONS)
End Sub
Public Sub Unhook()
Call SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
Call WTSUnRegisterSessionNotificationA(gHW)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_WTSSESSION_CHANGE
Select Case wParam
Case WTS_SESSION_LOCK
'Sitzung wird gesperrt
'...
Case WTS_SESSION_UNLOCK
'Sitzung wird entsperrt
'...
End Select
End Select
'Auf jeden Fall die Standardverarbeitung aufrufen
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
Alles anzeigen
Nun habe ich von VB aber keinen Plan. Kann mir da mal jemand helfen, das in AutoIt zu übersetzen?