Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Sperrung des Computers erkennen - Visual Basic 6

Mitglied: vbMaxi

vbMaxi (Level 1) - Jetzt verbinden

29.12.2007, aktualisiert 15.05.2008, 10987 Aufrufe, 10 Kommentare

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
Mitglied: misterdemeanor
04.01.2008 um 15:06 Uhr
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-
Bitte warten ..
Mitglied: vbMaxi
06.01.2008 um 18:31 Uhr
Hi Felix,
danke für deine Antwork. Leider ist API nicht meine stärke noch prezieser ausgedrückt ich hab überhaupt keine Ahnung davon^^. Ich hoffe du kannst mir helfen.
Mein Ansatz:
Module1:
01.
Public Declare Function WTSRegisterSessionNotificationA Lib "WtsApi32.dll"  
02.
Alias "WTSRegisterSessionNotification" (ByVal hWnd As Long, ByVal dwFlags As String) As  
03.
Boolean
Dann meine Form_Load:
01.
Dim t 
02.
t = Module1.WTSRegisterSessionNotificationA(Form1.hWnd, NOTIFY_FOR_THIS_SESSION) 
03.
 
04.
CALLBACK WindowProc(Form1.hWnd, WM_WTSSESSION_CHANGE, WTS_SESSION_LOCK, t)
Ok so weit so gut nur wenn ich das Programm ausführe erscheint folgende Fehlermeldung:
01.
Fehler beim Kompilieren: 
02.
 
03.
Sub oder Function nicht definiert
und "WindowProc" ist im Hintergrundfenster markiert.
Sorry bin ein hoffnungsloser Fall.

lg maxi
Bitte warten ..
Mitglied: misterdemeanor
07.01.2008 um 17:42 Uhr
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)

01.
Declare Function CallWindowProc Lib "user32" Alias _ 
02.
    "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _ 
03.
    ByVal hWnd As Long, ByVal MSG As Long, _ 
04.
    ByVal wParam As Long, ByVal lParam As Long) As Long 
05.
 
06.
Declare Function SetWindowLong Lib "user32" Alias _ 
07.
    "SetWindowLongA" (ByVal hWnd As Long, _ 
08.
    ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
09.
 
10.
Public Declare Function WTSRegisterSessionNotificationA Lib "WtsApi32.dll" Alias _ 
11.
    "WTSRegisterSessionNotification" (ByVal hWnd As Long, ByVal dwFlags As Long) As Long 
12.
     
13.
Public Declare Function WTSUnRegisterSessionNotificationA Lib "WtsApi32.dll" Alias _ 
14.
    "WTSUnRegisterSessionNotification" (ByVal hWnd As Long) As Long 
15.
     
16.
Private Const GWL_WNDPROC As Long = -4& 
17.
Private Const WM_WTSSESSION_CHANGE As Long = &H2B1 
18.
Private Const WTS_SESSION_LOCK As Long = 7 
19.
Private Const WTS_SESSION_UNLOCK As Long = 8 
20.
Public Const WTS_SESSION_LOGON As Long = 5 
21.
Public Const WTS_SESSION_LOGOFF As Long = 6 
22.
Private Const NOTIFY_FOR_THIS_SESSION As Long = &H0 
23.
 
24.
Private gHW As Long 
25.
Private lpPrevWndProc As Long 
26.
 
27.
Public Sub Hook(hWnd As Long) 
28.
    gHW = hWnd 
29.
    lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc) 
30.
    Call WTSRegisterSessionNotificationA(hWnd, NOTIFY_FOR_ALL_SESSIONS) 
31.
End Sub 
32.
 
33.
Public Sub Unhook() 
34.
    Call SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc) 
35.
    Call WTSUnRegisterSessionNotificationA(gHW) 
36.
End Sub 
37.
 
38.
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _ 
39.
    ByVal wParam As Long, ByVal lParam As Long) As Long 
40.
     
41.
    Select Case uMsg 
42.
      Case WM_WTSSESSION_CHANGE 
43.
        Select Case wParam 
44.
          Case WTS_SESSION_LOCK 
45.
            'Sitzuung wird gesperrt 
46.
              '... 
47.
          Case WTS_SESSION_UNLOCK 
48.
            'Sitzung wird entsperrt 
49.
              '... 
50.
        End Select 
51.
    End Select 
52.
      'Auf jeden Fall die Standardverarbeitung aufrufen 
53.
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) 
54.
End Function 
55.
 
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-
Bitte warten ..
Mitglied: vbMaxi
07.01.2008 um 21:31 Uhr
hi Felix,
danke für deine schnelle Reaktion. Tja leider komm ich schon wieder nicht weiter (sorry tut mir leid)^^. Also jetzt ist mein Problem noch wie erkenn ich das der Computer gesperrt wir das ich dann meine Befehle ausführen kann??

danke maxi!
Bitte warten ..
Mitglied: misterdemeanor
07.01.2008 um 22:23 Uhr
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...

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
Bitte warten ..
Mitglied: vbMaxi
08.01.2008 um 19:13 Uhr
hi Felix,
sorry hab die Kommentare echt überlesen, denn hab mir den Code im Opera angeschaut und der zeigt die Kommentare net farbig an (is ja logisch). Tja und so hab ich des halt net gespannt.

Hat einwandfrei funktioniert danke

lg Maxi
Bitte warten ..
Mitglied: vbAlti
15.05.2008 um 15:30 Uhr
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
Bitte warten ..
Mitglied: misterdemeanor
15.05.2008 um 16:18 Uhr
Hallo Heiko,

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.



Solltest Du dann noch Fragen haben öffne besser einen neuen Thread, da es in diesem ja eher um VB6 ging.

BG, Felix -misterdemeanor-
Bitte warten ..
Mitglied: vbAlti
15.05.2008 um 17:07 Uhr
Hallo Felix,

danke für den Hinweis. Beim suchen nach einer Lösung bin ich auch darüber gestolpert, dass ich inzwischen .NET habe (tja Radia...).

Danke nochmal. Ich suche (und bastel) noch was und melde mich dann wieder.

Gruss Heiko
Bitte warten ..
Mitglied: Netspark
06.08.2010 um 15:38 Uhr
Dein Code ist echt spitzenmässig!

Vor allem mit der Select-Case-Anweisung kann man alle Stati abfragen!
Ach ja: Funktioniert bestens mit Office 2003 und VBA!

API rocks!
Bitte warten ..
Ähnliche Inhalte
Visual Studio
Visual Basic für anfänger
gelöst Frage von Daoudi1973Visual Studio12 Kommentare

ich möchte Visual Basic lernen, kann jemand mir Tipps geben. PS: ich habe nur im 1999 mit Fortran 90 ...

VB for Applications
Visual Basic Checkbox drucken?
gelöst Frage von GERz0cKErZVB for Applications10 Kommentare

Hallo, ich habe ein Programm wo man mehrere checkboxen anklicken kann. Der Text der checkboxen soll am Ende gedruckt ...

Visual Studio
Bitcoin-Miner mit Visual Basic ?
Frage von Aicher1998Visual Studio2 Kommentare

Hallo, kennt jemand einen Ansatz, wie ich mit Visual Basic Bitcoins mine? Ich würde auch auf eine Python-DLL zurückgreifen ...

Visual Studio
Pastebin auslesen mit Visual Basic?
gelöst Frage von UltraZzVisual Studio2 Kommentare

Hey,ich würde gerne wissen wie man (z.B. für ein Passwort welches man immer wieder ändern kann,ohne das Programm zu ...

Neue Wissensbeiträge
Sicherheit

Interessante Methode für Leute, die in einer Windowsdomäne starke Kennwörter erzwingen wollen

Information von DerWoWusste vor 3 StundenSicherheit3 Kommentare

Dieser Artikel beschreibt, wie man auch ohne 3rd-party-tools die Kennwortsicherheit in Windows-Domänen erhöhen kann. Der Grundgedanke lautet: wir prüfen ...

Windows Server

SBS 2011: Installation von KB4457144 schlägt beim Reboot fehl - Von Dienst gesperrte Schriftart ursächlich

Tipp von the-buccaneer vor 14 StundenWindows Server1 Kommentar

Moinsen zusammen! Das hat mich einige graue Haare gekostet: Ein SBS 2011 weigerte sich schon im August, das monatl. ...

Windows Netzwerk
Browser-Lags und IPv6
Erfahrungsbericht von NixVerstehen vor 20 StundenWindows Netzwerk1 Kommentar

Hallo zusammen, wir betreiben als kleines Speditionsunternehmen ein überschaubares Windows-Netzwerk mit Win10-Clients sowie einem Server 2016 Essentials als "eierlegende ...

Humor (lol)

Erstaunlich, Windows mit extremer Laufzeit (Server) lol

Tipp von mathu vor 22 StundenHumor (lol)5 Kommentare

Was es so alles gibt. :-)

Heiß diskutierte Inhalte
Hyper-V
Windows Serer 2016 Standard virtualisieren
gelöst Frage von fritte87Hyper-V33 Kommentare

Hallo zusammen, ich muss für eine kleine Firma ein entsprechendes neues kleines Konzept bauen. Ich habe einen Server Standard ...

Windows Server
Fileserver von 2012 R2 auf 2012R2
gelöst Frage von ThabeusWindows Server23 Kommentare

Moin moin, leider war in der Vergangenheit der Fokus des Betriebs nicht auf Langfristigkeit ausgelegt. Daher stehe ich jetzt ...

Windows Server
Kann DNS-Einträge nicht finden
gelöst Frage von BPeterWindows Server19 Kommentare

Hallo, wenn ich folgenden Befehl absetze, bekomme ich eine Liste zurück mit allen Einträgen der DNS-Zone. Wenn ich aber ...

Router & Routing
Größere Zahl VPN-Verbindungen mit Fritz-Box einrichten
Frage von miscmikeRouter & Routing15 Kommentare

Hallo Zusammen, ich supporte verschiedene Kunden mit bestehenden LAN-LAN-Kopplungen via FritzBox (7490, FritzOS 7.01) . Anwendungen sind z.B. Kaspersky-KSC ...