1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

VB 2008 Systemweit Tastendruck registrieren und dann Aktion ausführen

Discussion in 'Programmieren' started by Gandalf87, Dec 9, 2010.

Thread Status:
Not open for further replies.
  1. Gandalf87

    Gandalf87 Byte

    Hallo zusammen

    Tja, der Titel sagt eigentlich schon alles.
    Es sollen Tastenanschläge registriert werden, egal ob ich Spiele, Surfe oder Sonstwas mache.
    Danach soll eine bestimmte Aktion ausgeführt werden.
    Da ich davon wenig Ahnung (das mit den Hooks hab ich gar nicht geschnallt) habe wäre ein einfaches, funktionierendes Beispielprogramm sicher hilfreich.

    Danke

    Gandalf
     
  2. VB-Coder

    VB-Coder Megabyte

    Hier mal ein Beispiel Code

    PHP:
    Public Class Form1

        
    Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtrByVal id As IntegerByVal fsModifier As IntegerByVal vk As Integer) As Integer
        
    Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtrByVal id As Integer)
        Private Const 
    Key_NONE As Integer = &H0
        
    Private Const WM_HOTKEY As Integer = &H312

        
    Protected Overrides Sub WndProc(ByRef m As Message)
            
            If 
    m.Msg WM_HOTKEY Then
                
                Select 
    Case m.WParam
                    
    Case 1
                        MessageBox
    .Show("Du hast die F9-Taste gedrückt!" vbCrLf "Das Programm wird ausgeblendet!" vbCrLf "Mit F10 kannst du es wieder einblenden")
                        
    Me.Hide()
                    Case 
    2
                        MessageBox
    .Show("Du hast die F10-Taste gedrückt!" vbCrLf "Das Programm wurde eingeblendet!" vbCrLf "Mit F9 kannst du es wieder ausblenden")
                        
    Me.Show()
                    Case 
    3
                        MessageBox
    .Show("Du hast die Taste A gedrückt!" vbCrLf "Hier würde jetzt eigentlich etwas passieren" vbCrLf "Als Beispiel wird hier Notepad gestartet.")
                        
    Process.Start("Notepad.exe")
                
    End Select
            End 
    If
            
    MyBase.WndProc(m)
        
    End Sub

        
    Private Sub Form1_FormClosing(ByVal sender As ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles Me.FormClosing
            UnregisterHotKey
    (Me.Handle1)
            
    UnregisterHotKey(Me.Handle2)
            
    UnregisterHotKey(Me.Handle3)
        
    End Sub

        
    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
            RegisterHotKey
    (Me.Handle1Key_NONEKeys.F9)
            
    RegisterHotKey(Me.Handle2Key_NONEKeys.F10)
            
    RegisterHotKey(Me.Handle3Key_NONEKeys.A)
            
    MessageBox.Show("Das Programm wird unsichtbar gemacht. Mit F10 kannst du es sichtbar machen")
            
    Me.Hide()
        
    End Sub
    End 
    Class
    Es gibt momentan 3 vordeffinierte Tasten

    F9 -> Blendet das Programmfenster aus
    F10 -> blendet das Programmfenster ein
    A -> startet Notepad

    Das Programmfenster wird beim Start automatisch ausgeblendet !

    Falls an dem Code was unklar ist, einfach fragen.

    MfG VB-Coder
     
    Last edited: Dec 10, 2010
  3. Gandalf87

    Gandalf87 Byte

    Super!
    Danke!

    Ich hab den Code mal für meine Zwecke abgeändert und jetzt bekomme ich eine Exeption bei der Erstellung des Fensterhandles.
    Woran könnte das liegen?
    Muss ich noch was erstellen oder was an Form oder Namen ändern?

    Dein original Code funktioniert aber.
    Wahrscheinlich ein dummer Anfängerfehler. :D


    Danke für den Code und weitere Hilfe

    Gandalf
     
    Last edited: Dec 10, 2010
  4. VB-Coder

    VB-Coder Megabyte

    Dann zeig mal deinen Code. Denn mit dem Hellsehen hab ich's nicht so ;-)
     
  5. Gandalf87

    Gandalf87 Byte

    Code:
    Public Class Form1
    
        ''Hotkeys aktivieren
        Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
        Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
        Private Const Key_NONE As Integer = &H0
        Private Const WM_HOTKEY As Integer = &H312
    
        Dim enable As Boolean = False
        Dim dark As Boolean = False
    
        Protected Overrides Sub WndProc(ByRef m As Message)
            If enable = True Then
    
                If m.Msg = WM_HOTKEY Then
    
                    Select Case m.WParam
                        Case 1
                            ''Minimieren
                            MsgBox("Minimieren")
    
                        Case 2
                            ''Bildschirm aktivieren/deaktivieren je nach Boolean Wert
                            If dark = False Then
                                MsgBox("Bildschirm abdunkeln")
                            Else
                                MsgBox("Bildschirm aktivieren")
                            End If
    
                    End Select
                End If
                MyBase.WndProc(m)
    
            End If
        End Sub
    
        ''Hotkeybindings löschen wenn Programm geschlossen wird
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            UnregisterHotKey(Me.Handle, 1)
            UnregisterHotKey(Me.Handle, 2)
        End Sub
    
        ''Hotkeys registrieren wenn das Programm gestartet wird
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.F11)
            RegisterHotKey(Me.Handle, 2, Key_NONE, Keys.F12)
        End Sub
       
        Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
            MsgBox("Hotkeys:" & vbCrLf & "F11: Minimieren" & vbCrLf & "F12: Bildschirm aktivieren/deaktivieren" & vbCrLf & "Bevor diese Funktionen genutzt werden können, muss der Button Aktivieren gedrückt werden." & vbCrLf & " Zum Vorübergehenden Deaktivieren der Deaktivieren Button.")
        End Sub
    
        Private Sub cmdActivate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdActivate.Click
            enable = True
            lblendis.Text = "Aktiviert"
        End Sub
    
        Private Sub cmdDeactivate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDeactivate.Click
            enable = False
            lblendis.Text = "Deaktiviert"
        End Sub
    End Class
    
    Mein Programm hat auf der Oberfläche 2 Buttons (Aktivieren & Deaktivieren) und 2 Label (Aktiviert/Deaktiviert & Anleitung)
     
  6. VB-Coder

    VB-Coder Megabyte

    ich bastel dir gerade ein Beispiel Projekt zusammen. Momentan grübel ich nur, wie ich es unter VB anstelle, den Monitor abzudunkeln. Sobald ich eine Lösung habe, poste ich dir das ganze Beispielprojekt.
     
  7. Gandalf87

    Gandalf87 Byte

    Danke!
    Echt nett.
    Mit der Hotkey Funktion kann man bestimmt viel machen.

    Gandalf
     
  8. VB-Coder

    VB-Coder Megabyte

    Also das mit dem Bildschirm abdunkeln kannst du vergessen. Das funktioniert nicht. Alles was geht, sind irgendwelche drittklassigen Versuche, das ganze wirken zu lassen, als würde man den Bildchirm abdunkeln. In Wahrheit passiert aber nichts der gleichen.


    Das fängt an bei irgendwelchen vollflächigen schwarzen Formen, die in einer Halbtransparenz über den Bildschirm gelegt werden und es so aussehen lassen, als würde man den Bildschirm abdunkeln, geht bis hin zum Versuch die Gamma Werte einzustellen. Was ich jetzt garnicht erst versucht habe, da es aus logischer Sicht eh nicht funktionieren dürfte.


    Was man machen könnte, wäre den Monitor in den Stand By Modus versetzen. Sprich also der Monitor schaltet ab. Aber auch dieser Versuch hat einen Haken. Sobald nämlich irgendwas aktiv wird, wird der Monitor automatisch aus dem Stand By Modus geholt. Also ist auch das wohl ehr eine mittelmäßige Lösung.


    Zumal fraglich bleibt, für welche Zwecke du den Monitor verdunkeln willst. Wenn du weiterhin daran arbeiten willst, also noch was sehen willst, dann fällt die Stand By Methode genauso wie das überblenden mit einer Vollflächigen Form aus. Denn im Stand by Modus ist der Monitor ganz aus und bei der halbtransparenten Form, liegt der Focus immer auf dieser. Was heisst, du kannst nichts was sich hinter dieser Form befindet bedienen.


    Also müsste eine Lösung her, mit der du die Helligkeit runter drehen kannst. Und die gibt es nicht, oder ist mir nicht bekannt. Der einzigste Lösungsansatz der mir einfällt, wäre die Grafikkarten-Einstellungen bezüglich der "Desktop Farbeinstellungen" anzusprechen und dort die Helligkeit zu regulieren. Wobei hier auch wieder fraglich bleibt, in wie weit sich das überhaupt unter VB umsetzen lässt.
     
  9. Gandalf87

    Gandalf87 Byte

    Ich meinte nicht abdunkeln sondern ausschalten/schwarzer Bildschirm/Standby.
    Hier schon geguckt?
    Hab mich nicht ganz klar ausgedrückt.
    Fehler gefunden?

    Danke für deine Hilfe
    Gandalf
     
    Last edited: Dec 13, 2010
  10. VB-Coder

    VB-Coder Megabyte

    Wie man den Monitor abschaltet, weiß ich *smile*

    Ich poste dir die Tage mal ein komplettes Beispielprojekt. Nur im Moment bin ich einfach gestresst vom Job.
     
  11. Gandalf87

    Gandalf87 Byte

    Wär auch gut wenn ich den Fehler im alten Code kennen würde, um ihn in der Zukunft zu vermeiden.
    Aber lass dir Zeit.

    Gandalf
     
  12. VB-Coder

    VB-Coder Megabyte

    Da du mich per PN angeschrieben hast und das Thema noch aktuell ist, hier nun wie versprochen ein Beispielprojekt.

    PHP:
    Imports System.Runtime.InteropServices
    Public Class Form1

        
    Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtrByVal id As IntegerByVal fsModifier As IntegerByVal vk As Integer) As Integer
        
    Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtrByVal id As Integer)
        Public Const 
    MOD_ALT = &H1
        
    Private Const WM_HOTKEY As Integer = &H312




        
    Public status As String
        Dim WithEvents oTimer 
    As Timer
        
    Public Class Monitor

            
    <DllImport("user32.dll"EntryPoint:="SendMessageA")> _
            
    Private Shared Sub SendMessage_
          ByVal hWnd 
    As IntPtr_
          ByVal uMsg 
    As Int32_
          ByVal wParam 
    As Int32_
          ByVal lParam 
    As Int32)
            
    End Sub


            
    Private Enum Params As Int32
                SC_MONITORPOWER 
    = &HF170    ' wParam
                WM_SYSCOMMAND = &H112       ' 
    uMsg
                TURN_MONITOR_OFF 
    2        ' Monitor ausschalten
                TURN_MONITOR_ON = -1        ' 
    Monitor einschalten
            End Enum


            
    Public Shared Sub SetMonitorState(ByVal Index As StringByVal Handle As IntPtr)
                
    Select Case Index
                    
    Case "off"
                        ' Schaltet den Monitor aus
                        SendMessage(Handle, Params.WM_SYSCOMMAND, Params.SC_MONITORPOWER, _
                          Params.TURN_MONITOR_OFF)
                    Case "on"
                        ' 
    Schaltet den Monitor wieder ein
                        SendMessage
    (HandleParams.WM_SYSCOMMANDParams.SC_MONITORPOWER_
                          Params
    .TURN_MONITOR_ON)
                
    End Select
            End Sub
        End 
    Class









        Protected 
    Overrides Sub WndProc(ByRef m As Message)

            If 
    m.Msg WM_HOTKEY Then

                Select 
    Case m.WParam
                    
    Case 1

                        
    If status "an" Then
                            Monitor
    .SetMonitorState("off"Me.Handle)
                            
    status "aus"
                        
    Else
                            
    Monitor.SetMonitorState("on"Me.Handle)
                            
    status "an"
                        
    End If
                    Case 
    2
                        MessageBox
    .Show("ALT + F10" vbCrLf "Diese Hilfe anzeigen" vbCrLf vbCrLf "ALT + F9" vbCrLf "Monitor ein/ausschalten")

                
    End Select
            End 
    If
            
    MyBase.WndProc(m)
        
    End Sub

        
    Private Sub Form1_FormClosing(ByVal sender As ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles Me.FormClosing
            UnregisterHotKey
    (Me.Handle1)
            
    UnregisterHotKey(Me.Handle2)

        
    End Sub

        
    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
            RegisterHotKey
    (Me.Handle1MOD_ALTKeys.F9)
            
    RegisterHotKey(Me.Handle2MOD_ALTKeys.F10)
            
    status "an"
            
    oTimer = New Timer
            oTimer
    .Interval 1
            oTimer
    .Start()

        
    End Sub

        
    Private Sub oTimer_Tick(ByVal sender As Object_
    ByVal e 
    As System.EventArgsHandles oTimer.Tick
            oTimer
    .Stop()
            
    Me.Hide()
            
    MessageBox.Show("ALT + F10" vbCrLf "Diese Hilfe anzeigen" vbCrLf vbCrLf "ALT + F9" vbCrLf "Monitor ein/ausschalten")

        
    End Sub
    End 
    Class
     
  13. Gandalf87

    Gandalf87 Byte

    Super, Danke
    :spitze:

    Ich hab den Code allerdings mit VB 2010 Express verwendet.
    Klappt auch.
    Problem gelöst, dazugelernt, Thread kann geschlossen werden.

    Gandalf
     
Thread Status:
Not open for further replies.

Share This Page