Funktion/Controlclick vor/bei/nach PC-Sperrung

  • Hiho,

    ich bin auf der Arbeit nun mit einem Tel-Client an eine Tel-Anlage gekoppelt.
    Immer wenn wir länger weg sind, müssen wir uns manuell in dem Client auf Pause stellen.

    Da ich das immer vergesse, wollte ich das automatisieren, denn immer wenn ich länger nicht am Platz bin (was heisst ich müsste mich am Client abmelden), sperre ich meinen PC.
    Kann man vor/bei/nach dieser Aktion noch eine Funktion/ Controlklicks durchführen?

    Also wenn z.B. WIN+L oder STRG+ALT+ENT und Computer sperren gedrückt wird?

  • Machs doch über eine andere Tastenkombination ;)

    Spoiler anzeigen
    [autoit]

    HotKeySet('^l', '_Logout')

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Logout()
    ;~ ControlClick(...)
    Send('#l')
    EndFunc

    [/autoit]
  • Bei XP gibt es dafür WTSRegisterSessionNotification ;)

    Spoiler anzeigen
    [autoit]

    #include<EditConstants.au3>
    #include<WindowsConstants.au3>
    #include<GUIConstantsEx.au3>
    Global Const $NOTIFY_FOR_THIS_SESSION = 0
    Global Const $NOTIFY_FOR_ALL_SESSIONS = 1
    Global Const $WM_WTSSESSION_CHANGE = 0x02B1
    Global Enum $WTS_CONSOLE_CONNECT = 0x1, $WTS_CONSOLE_DISCONNECT, _
    $WTS_REMOTE_CONNECT, $WTS_REMOTE_DISCONNECT, _
    $WTS_SESSION_LOGON, $WTS_SESSION_LOGOFF, _
    $WTS_SESSION_LOCK, $WTS_SESSION_UNLOCK, _
    $WTS_SESSION_REMOTE_CONTROL
    Global Const $aWTS_EVENTS[10][3] = [ [""], _ ; Codes fangen bei 1 an, also ist array[0] leer
    [ "WTS_CONSOLE_CONNECT", "0x1", "A session was connected to the console terminal." ], _
    [ "WTS_CONSOLE_DISCONNECT", "0x2", "A session was disconnected from the console terminal." ], _
    [ "WTS_REMOTE_CONNECT", "0x3", "A session was connected to the remote terminal." ], _
    [ "WTS_REMOTE_DISCONNECT", "0x4", "A session was disconnected from the remote terminal." ], _
    [ "WTS_SESSION_LOGON", "0x5", "A user has logged on to the session." ], _
    [ "WTS_SESSION_LOGOFF", "0x6", "A user has logged off the session." ], _
    [ "WTS_SESSION_LOCK", "0x7", "A session has been locked." ], _
    [ "WTS_SESSION_UNLOCK", "0x8", "A session has been unlocked." ], _
    [ "WTS_SESSION_REMOTE_CONTROL", "0x9", "A session has changed its remote controlled status. To determine the status, call GetSystemMetrics and check the SM_REMOTECONTROL metric." ] _
    ]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hWndGUI = GUICreate("WM_WTSSESSION_CHANGE", 400, 400)
    $Button_Register = GUICtrlCreateButton("Register Msg", 10, 10, 185, 30)
    $Button_UnRegister = GUICtrlCreateButton("UnRegister Msg", 205, 10, 185, 30)
    GUICtrlSetState($Button_UnRegister, $GUI_DISABLE)
    $LogWin = GUICtrlCreateEdit("", 10, 50, 380, 315, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUICtrlCreateLabel("WM_WTSSESSION_CHANGE-Demo: ©2009 by Prog@ndy", 10, 375, 380, 20)
    GUIRegisterMsg($WM_WTSSESSION_CHANGE, "MY_WM_WTSSESSION_CHANGE")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $Button_Register
    Local $aResult = DllCall("wtsapi32.dll", "int", "WTSRegisterSessionNotification", "hwnd", $hWndGUI, "dword", $NOTIFY_FOR_THIS_SESSION)
    If Not @error And $aResult[0]<>0 Then
    GUICtrlSetState($Button_Register, $GUI_DISABLE)
    GUICtrlSetState($Button_UnRegister, $GUI_ENABLE)
    EndIf
    Case $Button_UnRegister
    Local $aResult = DllCall("wtsapi32.dll", "int", "WTSUnRegisterSessionNotification", "hwnd", $hWndGUI)
    If Not @error And $aResult[0]<>0 Then
    GUICtrlSetState($Button_UnRegister, $GUI_DISABLE)
    GUICtrlSetState($Button_Register, $GUI_ENABLE)
    EndIf
    Case $GUI_EVENT_CLOSE
    Exit
    DllCall("wtsapi32.dll", "int", "WTSUnRegisterSessionNotification", "hwnd", $hWndGUI)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func MY_WM_WTSSESSION_CHANGE($hWnd, $uMsg, $wParam, $lParam)
    ConsoleWrite($wParam & @CRLF)
    If $wParam < 1 Or $wParam > 9 Then Return 0
    Local $iLength = GUICtrlSendMsg($LogWin, $WM_GETTEXTLENGTH, 0, 0)
    GUICtrlSendMsg($LogWin, $EM_SETSEL, $iLength, $iLength)
    GUICtrlSetData($LogWin, _
    "WM_WTSSESSION_CHANGE :: " & $aWTS_EVENTS[$wParam][0] & @CRLF & _
    @TAB & "Code: " & $aWTS_EVENTS[$wParam][1] & @CRLF & _
    @TAB & "Desc.: " & $aWTS_EVENTS[$wParam][2] & @CRLF, 1 _
    )
    Return 0
    EndFunc

    [/autoit]
  • Ich glaube nicht. Muss die Aktion unbedingt vor dem Lock ausgeführt werden oder reicht eventuell auch danach? Hast du das schon ausprobiert?

  • weiss nicht ob das hier so ok ist, ich will es auch nur für meinen oben genannten grund verwenden.
    kann man nicht den befehl WIN + L abfangen?

    hab mal gelesen, das bei BlockInput ja der Affengriff nicht gesperrt ist, jmd meinte aber, dass man selbst das machen könnte.
    würde das für WIN+L gehen? also ich fange den befehl ab, setze pause und stoße dann "pc sperren" per script neu an.

  • hier die lösung aus dem englischen forum:

    [autoit]

    #Include <HotKey.au3>

    [/autoit][autoit][/autoit][autoit]

    Global Const $VK_ESCAPE = 0x1B
    Global Const $VK_L = 0x4C

    [/autoit][autoit][/autoit][autoit]

    _HotKeyAssign(BitOR($CK_WIN, $VK_L), 'MyFunc')
    _HotKeyAssign(BitOR($CK_CONTROL, $VK_ESCAPE), 'Quit')

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func MyFunc()
    MsgBox(0, '', 'WIN-L has been pressed!')
    DllCall('user32.dll', 'int', 'LockWorkStation')
    EndFunc ;==>MyFunc

    [/autoit][autoit][/autoit][autoit]

    Func Quit()
    Exit
    EndFunc ;==>Quit

    [/autoit]

    funzt einwandfrei, super sache das =)

  • Hallo sc4ry

    Ich habe bei uns im Geschäft ein ähnliches problem.

    Ich habs so gelöst, dass ich schaue, ob der Bildschirm gelockt ist.

    Ich schaue also nicht auf einen Hotkey. (Was ist, wenn man den Bildschirm via CTRL-ALT-Delete und dann Lock den Bildschirm sperrt??? dann wird dein Hotkey nie benutzt)

    Hab den Teil, um zu schauen, ob der Screen gelockt wurde aus einem Forum. (Weiss aber nicht mehr, ob aus diesem Forum, oder aus dem Englischen. Kann somit leider auch keinen Link auf das Post geben)

    Hier die Funktion, die ich brauche.

    [autoit]

    Func _IsLocked()
    $hDesktop = DllCall("User32.dll", "int", "OpenDesktop", "str", "Default", "int", 0, "int", 0, "int", $DESKTOP_SWITCHDESKTOP)
    $ret = DllCall("User32.dll", "int", "SwitchDesktop", "int", $hDesktop[0])
    DllCall("User32.dll", "int", "CloseDesktop", "int", $ret[0])
    If $ret[0] Then
    ;ConsoleWrite("unlocked" & @lf)
    $bScreenSaverAktiv = False
    Return SetError(0, 0, 0)
    Else
    ;ConsoleWrite("Locked" & @lf)
    If isScreensaverOn() = 1 Then
    ;ConsoleWrite("Screensaver on" & @LF)
    $bScreenSaverAktiv = True
    Return SetError(0, 0, 0)
    Else
    Return SetError(0, 0, 1)
    EndIf
    EndIf
    EndFunc ;==>_IsLocked

    [/autoit]


    Wenn der Screen gelockt ist, checke ich auch noch, ob der Bildschirmschoner läuft. Wenn der läuft, dann kann es ja sein, dass man am Arebitsplatz ist, aber gerade etwas anderes macht.

    Für den Bildschirmschoner schaue ich einfach, ob es einen Process gibt, der mit .scr endet. (Dies sind ja die Bildschirmschoner)

    Hier meine Funktion um den Bildschirmschoner zu checken.

    [autoit]

    Func isScreensaverOn()
    ; 1 = on , 0 = off
    Local $list = ProcessList()
    For $i = 1 To $list[0][0]
    If StringInStr($list[$i][0], ".scr") Then Return 1
    Next
    Return 0
    EndFunc ;==>isScreensaverOn

    [/autoit]


    Dann melde ich mich an der Tel. Anlage nicht ab.

    Funktioniert bei mir super.


    Gruss Roger

  • Was passiert, wenn du die app einfach schliesst, ohne dich abzumelden?

    Unsere Telsoft meldet sich ab, wenn der Prozess geschlossen wird.

    Kann ja sein, dass du einen Bluescreen oder sonst einen Absturtz hast und dann musst du ja auch abgemledet werden.