Sperrung des Computers erkennen - Visual Basic 6
Hallo @all,
ich möchte mein Programm etwas professioneller gestalten. Zurzeit loggt es, wenn sich die Maus 3 Minuten nicht bewegt, dass der Rechner gesperrt ist. Das ist allerdings nicht der Sinn der Sache. Also meine Frage giebt es eine Möglichkeit bei Sperrung des Arbeitsplatzes ein paar Aktionen in einem Visual Basic Programm ausführen zu lassen.
Wichtige Infos:
System: Windows XP Home Edition
Rechte: Admin
Schonmal Danke und einen Guten Rutsch
lg vbmaxi
ich möchte mein Programm etwas professioneller gestalten. Zurzeit loggt es, wenn sich die Maus 3 Minuten nicht bewegt, dass der Rechner gesperrt ist. Das ist allerdings nicht der Sinn der Sache. Also meine Frage giebt es eine Möglichkeit bei Sperrung des Arbeitsplatzes ein paar Aktionen in einem Visual Basic Programm ausführen zu lassen.
Wichtige Infos:
System: Windows XP Home Edition
Rechte: Admin
Schonmal Danke und einen Guten Rutsch
lg vbmaxi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 76822
Url: https://administrator.de/contentid/76822
Ausgedruckt am: 19.11.2024 um 03:11 Uhr
10 Kommentare
Neuester Kommentar
Grüß Dich vbmaxi,
also seit XP ist das relativ einfach:
Du musst lediglich in der WindowProc auf WM_WTSSESSION_CHANGE horchen. Zuvor musst Du Dein Prog durch Aufruf von WTSRegisterSessionNotification zum Erhalt der Message registrieren.
bg, Felix -misterdemeanor-
also seit XP ist das relativ einfach:
Du musst lediglich in der WindowProc auf WM_WTSSESSION_CHANGE horchen. Zuvor musst Du Dein Prog durch Aufruf von WTSRegisterSessionNotification zum Erhalt der Message registrieren.
bg, Felix -misterdemeanor-
Hallo maxi,
die API ist nunmal in einer Windows-Umgebung sehr hilfreich. DefinitivWert etwas studiert zu werden. Hier hast Du mal einen guten Ansatz für Dein Problem: (TIP: dieser Code kommt in ein MODUL)
In Deinem MainForm (am besten Startformular) rufst im Load-Event die Hook Methode auf. Somit sagst Du an das Du eine WindowProc hast und registrierst Dich für das WM_WTSSESSION_CHANGE Event.
Im Unload-Event rufst Du noch UnHook auf...fertig.
Da es das WM_WTSSESSION_CHANGE Event ja erst ab WinXP gibt wäre noch eine Kontrolle danach empfehlenswert. (Eigtl. absolutes muss für jede Anwendung).
Hier findest Du eine gute Anleitung dafür....hofftl. kannst DuDich dafür begeistern.
Viel Spaß damit
bg, Felix -mrdemeanor-
die API ist nunmal in einer Windows-Umgebung sehr hilfreich. DefinitivWert etwas studiert zu werden. Hier hast Du mal einen guten Ansatz für Dein Problem: (TIP: dieser Code kommt in ein MODUL)
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
'Sitzuung 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
In Deinem MainForm (am besten Startformular) rufst im Load-Event die Hook Methode auf. Somit sagst Du an das Du eine WindowProc hast und registrierst Dich für das WM_WTSSESSION_CHANGE Event.
Im Unload-Event rufst Du noch UnHook auf...fertig.
Da es das WM_WTSSESSION_CHANGE Event ja erst ab WinXP gibt wäre noch eine Kontrolle danach empfehlenswert. (Eigtl. absolutes muss für jede Anwendung).
Hier findest Du eine gute Anleitung dafür....hofftl. kannst DuDich dafür begeistern.
Viel Spaß damit
bg, Felix -mrdemeanor-
Hey,
also...schaue dir mal den Code an den ich gepostet habe. Du siehst dort eine Function namens WindowProc (steht für Windows Procedure). Diese ermöglichen uns Programmierern mehr Möglichkeiten.
Windows feuert (sendet) andauernd Ereignisse an (u.a.) geöffnete Anwendungen. D.h. wenn Du zB /inDeinem/ Programm die Maus bewegst schickt WINDOWS schon einige dutzend Ereignisse (Mitteilungen) ab-->das Ereignis das die Maus bewegt wird (uMsg in unserer WindowProc hätte dann den Wert der Konstanten WM_MOUSEMOVE). Auch wird uns mitgeteilt wo sich der Zeiger befindet(wParam enthält dann die X und Y Position des Mauszeigers). Das selbe passiert wenn Du eine Maustaste oder eine Tastaturtaste drückst. Natürlich gibt es noch sehr viel mehr Ereignisse auf die wir von Zeit zu Zeit gerne von Windows informiert werden wollen.
Genauso feuert Windows ein Ereignis wenn der Computer gesperrt wird--->WM_WTSSESSION_CHANGE. Innerhalb der WindowProc können wir also ein Ereignis "abfangen" (Select Case uMsg). Wenn also WM_WTSSESSION_CHANGE eintritt, können wir noch genauer abfragen was sich an der SESSION geCHANGEd hat--->Select Case wParam.
Wenn Du jetzt im geposteten Code nachschaust solltest Du noch mal auf meine Kommentare achten...dort kannst Du die Codezeilen implementieren die ausgeführt werden sollen wenn die SESSION geLOCKed bzw. UNgeLOCKed werden...
Nein. irgendwann fängt jeder mal an Solange Du Dich dafür interessierst und etwas ernst...
Dann hoffe ich das ich Dir weiterhelfen konnte. Vielleicht ein Grund mehr für Dich noch mal selbst tiefer in die Materie einzusteigen *fg
also...schaue dir mal den Code an den ich gepostet habe. Du siehst dort eine Function namens WindowProc (steht für Windows Procedure). Diese ermöglichen uns Programmierern mehr Möglichkeiten.
Windows feuert (sendet) andauernd Ereignisse an (u.a.) geöffnete Anwendungen. D.h. wenn Du zB /inDeinem/ Programm die Maus bewegst schickt WINDOWS schon einige dutzend Ereignisse (Mitteilungen) ab-->das Ereignis das die Maus bewegt wird (uMsg in unserer WindowProc hätte dann den Wert der Konstanten WM_MOUSEMOVE). Auch wird uns mitgeteilt wo sich der Zeiger befindet(wParam enthält dann die X und Y Position des Mauszeigers). Das selbe passiert wenn Du eine Maustaste oder eine Tastaturtaste drückst. Natürlich gibt es noch sehr viel mehr Ereignisse auf die wir von Zeit zu Zeit gerne von Windows informiert werden wollen.
Genauso feuert Windows ein Ereignis wenn der Computer gesperrt wird--->WM_WTSSESSION_CHANGE. Innerhalb der WindowProc können wir also ein Ereignis "abfangen" (Select Case uMsg). Wenn also WM_WTSSESSION_CHANGE eintritt, können wir noch genauer abfragen was sich an der SESSION geCHANGEd hat--->Select Case wParam.
Wenn Du jetzt im geposteten Code nachschaust solltest Du noch mal auf meine Kommentare achten...dort kannst Du die Codezeilen implementieren die ausgeführt werden sollen wenn die SESSION geLOCKed bzw. UNgeLOCKed werden...
Sorry bin ein hoffnungsloser Fall.
Nein. irgendwann fängt jeder mal an Solange Du Dich dafür interessierst und etwas ernst...
ich möchte mein Programm etwas professioneller gestalten.
Dann hoffe ich das ich Dir weiterhelfen konnte. Vielleicht ein Grund mehr für Dich noch mal selbst tiefer in die Materie einzusteigen *fg
Hi Felix,
Ich denke Dein geposteter Code ist genau das was ich brauche , Danke. Nur habe ich ihn bisher nicht ausprobieren können, da er mir beim Erstellen
Der Ausdruck "AddressOf" kann nicht in "Long" umgewandelt werden, da er kein Delegattyp ist.
rausschreibt und bezieht sich auf:
Public Sub Hook(ByVal hWnd As Long)
gHW = hWnd
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
Call WTSRegisterSessionNotificationA(hWnd, NOTIFY_FOR_ALL_SESSIONS)
End Sub
Vielen Dank für Deine Hilfe
Gruß Heiko
Ich denke Dein geposteter Code ist genau das was ich brauche , Danke. Nur habe ich ihn bisher nicht ausprobieren können, da er mir beim Erstellen
Der Ausdruck "AddressOf" kann nicht in "Long" umgewandelt werden, da er kein Delegattyp ist.
rausschreibt und bezieht sich auf:
Public Sub Hook(ByVal hWnd As Long)
gHW = hWnd
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
Call WTSRegisterSessionNotificationA(hWnd, NOTIFY_FOR_ALL_SESSIONS)
End Sub
Vielen Dank für Deine Hilfe
Gruß Heiko
Hallo Heiko,
Das sieht ganz nach VB .Net (VB 2005/2008) aus.
Obiger Code ist für Visual Basic 6 ausgelegt.
Mit dem .Net Framework geht das ganze viel einfacher:
Du überschreibst direkt die WndProc Function Deines Controls. Stichwort SubClassing.
Solltest Du dann noch Fragen haben öffne besser einen neuen Thread, da es in diesem ja eher um VB6 ging.
BG, Felix -misterdemeanor-
Der Ausdruck "AddressOf" kann nicht in "Long" umgewandelt werden, da er kein Delegattyp ist.
Das sieht ganz nach VB .Net (VB 2005/2008) aus.
Obiger Code ist für Visual Basic 6 ausgelegt.
Mit dem .Net Framework geht das ganze viel einfacher:
Du überschreibst direkt die WndProc Function Deines Controls. Stichwort SubClassing.
- Ein (etwas umständliches) Beispiel ist z.B. im vb@rchiv zu finden: SubClassing mit VB.NET 2005.
- Am besten natürlich immer direkt in der MSDN nachschauen: Control.WndProc Method.
Solltest Du dann noch Fragen haben öffne besser einen neuen Thread, da es in diesem ja eher um VB6 ging.
BG, Felix -misterdemeanor-