Systemweiten Hotkey registrieren (kein Tastatur Hook)

    • VB.NET

    Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von VB.neter0101.

      Systemweiten Hotkey registrieren (kein Tastatur Hook)

      Hallo,

      Wichtig:
      Dieser Beispiel Code wurde hier nicht gepostet um Illegale Dinge zu treiben.
      Falls die Moderatoren oder der Administrator dieses Forums bedenken wegen des Codes haben, mögen Sie diesen Beitrag wieder löschen.


      Wie kann ich eine x-beliebige Taste Systemweit abfangen, egal ob meine Anwendung Aktiv ist oder nicht.
      Dies geht über einen sogenannten Tastatur Hook.
      Dabei wird eine Windows-Message abgefangen, ausgewertet und wie wenn nichts geschehen wäre weitergeleitet.
      Beispiel:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
      3. Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
      4. Private Const Key_NONE As Integer = &H0
      5. Private Const WM_HOTKEY As Integer = &H312
      6. Protected Overrides Sub WndProc(ByRef m As Message)
      7. 'die messages auswerten
      8. If m.Msg = WM_HOTKEY Then
      9. 'hier wird entschieden welcher hotkey es war
      10. 'einfach die übergebene id auswerten
      11. Select Case m.WParam
      12. Case 1
      13. MessageBox.Show("Sie haben die Tab-Taste gedrückt!")
      14. Case 2
      15. MessageBox.Show("Sie haben die 1 gedrückt!")
      16. End Select
      17. End If
      18. MyBase.WndProc(m)
      19. End Sub
      20. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      21. 'die tab taste wieder freigeben
      22. UnregisterHotKey(Me.Handle, 1)
      23. UnregisterHotKey(Me.Handle, 2)
      24. End Sub
      25. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      26. 'die tab taste abfangen
      27. RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.Tab)
      28. RegisterHotKey(Me.Handle, 2, Key_NONE, Keys.D1)
      29. End Sub
      30. End Class


      EDIT:
      Code um einen zweiten Hotkey erweitert.

      Gruss

      mikeb69

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ () aus folgendem Grund: Titel korrigiert

      Hi,

      ich habe Probleme mit diesem Code.

      Erstelle ich ein neues Projekt und füge den Code ein funktioniert alles.
      Füge ich den Code aber in mein vorhandenes Projekt ein, reagiert das Programm auf keine Tastenkombination.

      Gibt es irgendeinen Code, der den HotKey sperren könnte oder ähnliches? Bzw. was könnte ein Grund sein, das es nicht funktioniert?

      MfG T1g0r
      wintoolz.de
      • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
      • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
      • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

      Benutze auch du Ecosia
      Evtl. könnte es daran liegen, was du damit erreichen willst. Vielleicht hast du eine If-Abfrage drin die alles abwehrt oder nicht ganz durchdacht ist. Setz einen Haltepunkt auf "Select Case m.WParam" in dem WndProc-Sub und dann geh dein vorhandenes Projekt einfach mal an der Stelle mit F8 (Einzelschritt) durch.
      Damit solltest du den Fehler selbst finden.
      Das Problem ist, wenn ich einen Breakpoint bei dem Select Case setze, hält das Programm dort nicht an. Als wäre der Hotkey garnicht registriert...
      wintoolz.de
      • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
      • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
      • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

      Benutze auch du Ecosia
      Dann zip mal das Projekt und lad es hoch oder wenigstens den Code der Form (es reichen die vollständigen Subs wo du registrierst, entregistrierst und den Hotkey bearbeitest), denn so kann ich dir auch nicht sagen, woran es liegt.
      Hier ist der Teil zum registrieren des Hotkey:
      Der wichtige Teil ist mit '################### markiert (Zeile 150)
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
      2. Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
      3. Private Const Key_NONE As Integer = &H0 'Nichts
      4. Private Const Key_ALT As Integer = &H1 'Alt
      5. Private Const Key_CTRL As Integer = &H2 'Strg
      6. Private Const Key_SHIFT As Integer = &H4 'Shift
      7. Private Const Key_WIN As Integer = &H8 'Win
      8. Private Const WM_HOTKEY As Integer = &H312
      9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      10. Try
      11. 'Datenbankpfad laden
      12. Dim vDatenbank As String = String.Empty
      13. If Element_Laden("Database") = "StartUp" Then
      14. vDatenbank = IO.Path.Combine(Application.StartupPath, "CodeGallery.db")
      15. Else
      16. vDatenbank = Element_Laden("Database")
      17. End If
      18. myConnection.ConnectionString = "Data Source=" & vDatenbank & ";Version=3;" 'Connection festlegen
      19. myConnectionZusatz.ConnectionString = "Data Source=" & vDatenbank & ";Version=3;" 'Connection festlegen
      20. 'Datenbankkompatibilität prüfen
      21. 'Prüfen ob Versions-Tabelle vorhanden ist
      22. myConnection.Open() 'Connection öffnen
      23. myCommand = New SQLiteCommand("SELECT COUNT(tbl_name) FROM sqlite_master WHERE tbl_name = 'Version'", myConnection) 'Command festlegen
      24. myReader = myCommand.ExecuteReader 'Command ausführen
      25. Dim AppVersion As Integer
      26. If myReader("COUNT(tbl_name)") = 0 Then
      27. AppVersion = 0
      28. Else
      29. myConnectionZusatz.Open() 'Connection öffnen
      30. myCommand = New SQLiteCommand("SELECT * FROM Version", myConnectionZusatz) 'Command festlegen
      31. myReaderZusatz = myCommand.ExecuteReader 'Command ausführen
      32. AppVersion = CInt(myReaderZusatz("Version"))
      33. myReaderZusatz.Close() 'Reader schliesen
      34. myConnectionZusatz.Close() 'Connection schliesen
      35. End If
      36. myReader.Close() 'Reader schliesen
      37. myConnection.Close() 'Connection schliesen
      38. 'Datenbank ändern
      39. If Not AppVersion = 5 Then '5 aktuelle
      40. Call Datenbank_Ändern(AppVersion)
      41. End If
      42. 'Settingskompatibilität prüfen
      43. Dim vVersionStr As String = Element_Laden("Version")
      44. Dim vVersionInt As Integer
      45. vVersionInt = vVersionStr.Replace(".", "")
      46. If Not vVersionInt = 7 Then '7 aktuelle
      47. 'Settings ändern
      48. Dim vSettingVer As Integer
      49. If vVersionStr.ToString.Contains(".") Then
      50. vSettingVer = vVersionInt
      51. Else
      52. vSettingVer = vVersionInt 'Element_Laden("Version")
      53. End If
      54. Call Settings_Ändern(vSettingVer)
      55. End If
      56. 'Alle Inhalte mit NULL durch String.Empty ersetzen
      57. myConnection.Open() 'Connection öffnen
      58. myCommand = New SQLiteCommand("UPDATE Einträge SET Anhang=@Leer WHERE Anhang IS NULL OR Anhang=X'';" & _
      59. "UPDATE Einträge SET Endung=@Leer WHERE Endung IS NULL;" & _
      60. "UPDATE Einträge SET Icon=@Leer WHERE Icon IS NULL OR Icon=X'';" & _
      61. "UPDATE Einträge SET Breakpoints=@Leer WHERE Breakpoints IS NULL;" & _
      62. "UPDATE Einträge SET Tags=@Leer WHERE Tags IS NULL;" & _
      63. "UPDATE Kategorien SET Icon=@Leer WHERE Icon IS NULL OR Icon=X'';" & _
      64. "UPDATE Kategorien SET Parent=@Leer WHERE Parent IS NULL;", myConnection) 'Command festlegen
      65. myCommand.Parameters.AddWithValue("@Leer", String.Empty)
      66. myCommand.ExecuteNonQuery() 'Command ausführen
      67. myConnection.Close() 'Connection schliesen
      68. 'Formgröße und Location laden
      69. 'Location
      70. Dim sLocFull As String = Element_Laden("Location")
      71. Dim aLoc As String() = Split(sLocFull, "; ")
      72. Me.Left = CInt(aLoc(0))
      73. Me.Top = CInt(aLoc(1))
      74. 'Size
      75. Dim sSizeFull As String = Element_Laden("Size")
      76. Dim aSize As String() = Split(sSizeFull, "; ")
      77. Me.Width = CInt(aSize(0))
      78. Me.Height = CInt(aSize(1))
      79. If Element_Laden("Maximum") = True Then
      80. Me.WindowState = FormWindowState.Maximized
      81. Else
      82. Me.WindowState = FormWindowState.Normal
      83. End If
      84. 'Tags anzeigen
      85. Call Tags_Visible()
      86. 'ColumnBreite
      87. tlv_Haupt.Columns(0).AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize)
      88. tlv_Haupt.Columns.Remove(ClmHd_Sprache)
      89. Call Sprachen_Laden(cmb_Sprache, True)
      90. cmb_Sprache.Text = CStr(Element_Laden("Current"))
      91. 'Autobackup
      92. If CBool(Element_Laden("Backup_On")) = True Then
      93. 'Prüfen ob heute schon erstellt
      94. Dim Dateiname As String = Today.Year & Today.Month & Today.Day
      95. 'Nicht erstellt
      96. If Not IO.File.Exists(IO.Path.Combine(CStr(Element_Laden("Backup_Path")), "cg_backup_" & Dateiname & ".cgbkp")) Then
      97. 'Datei kopieren (BGW aufrufen)
      98. bgw_Backup.RunWorkerAsync()
      99. End If
      100. End If
      101. 'Display laden
      102. 'SplitView
      103. CodeEditorControlHaupt.SplitView = CBool(Element_Laden("SV_Visible"))
      104. 'Breakpoint
      105. CodeEditorControlHaupt.ShowGutterMargin = CBool(Element_Laden("BP_Visible"))
      106. Dim Farbteil As String() = Split(CStr(Me.Element_Laden("BP_Color")), ";")
      107. CodeEditorControlHaupt.BreakPointBackColor = Color.FromArgb(Farbteil(0), Farbteil(1), Farbteil(2), Farbteil(3))
      108. 'Liniennummer
      109. CodeEditorControlHaupt.ShowLineNumbers = CBool(Element_Laden("LN_Visible"))
      110. Farbteil = Split(CStr(Me.Element_Laden("LN_Color")), ";")
      111. CodeEditorControlHaupt.LineNumberForeColor = Color.FromArgb(Farbteil(0), Farbteil(1), Farbteil(2), Farbteil(3))
      112. 'Aktive Linie
      113. CodeEditorControlHaupt.HighLightActiveLine = CBool(Element_Laden("AL_Visible"))
      114. Farbteil = Split(CStr(Me.Element_Laden("AL_Color")), ";")
      115. CodeEditorControlHaupt.HighLightedLineColor = Color.FromArgb(Farbteil(0), Farbteil(1), Farbteil(2), Farbteil(3))
      116. 'Menu
      117. mstr_Main.Visible = CBool(Element_Laden("Menu"))
      118. 'Shortcuts laden
      119. Call Shortcuts_laden()
      120. 'Globaler Hotkey registrieren
      121. 'Tasten trennen
      122. 'Dim Tasten As String = frm_Optionen.Shortcut_Laden(Me.Global_HotKey)
      123. 'Dim Einzeltaste As Integer = CInt(AscW(Tasten.Remove(0, Tasten.LastIndexOf("+") + 1)))
      124. 'Dim Sondertaste As Integer = 0
      125. 'If Tasten.Contains("Alt") Then
      126. 'Sondertaste += 1
      127. 'End If
      128. 'If Tasten.Contains("Strg") Then
      129. 'Sondertaste += 2
      130. 'End If
      131. 'If Tasten.Contains("Shift") Then
      132. 'Sondertaste += 4
      133. 'End If
      134. '############################################
      135. '############################################
      136. '############################################
      137. RegisterHotKey(Me.Handle, 1, &H4, Keys.K)
      138. 'Alte Ereignisdatei löschen
      139. IO.File.Delete(IO.Path.Combine(IO.Path.GetTempPath, "cg.Ereignisse.txt"))
      140. 'Dateianhang
      141. ToolTipAnhang.SetToolTip(pic_Anhang, "Kein Anhang vorhanden")
      142. pic_Anhang.Tag = String.Empty
      143. ''Statusbar verwalten
      144. 'If AnzahlItems = 1 Then
      145. ' Me.ToolStripStatusLabel_Anzahl.Text = "Aktuell vorhanden: " & AnzahlItems & " Eintrag"
      146. 'Else
      147. ' Me.ToolStripStatusLabel_Anzahl.Text = "Aktuell vorhanden: " & AnzahlItems & " Einträge"
      148. 'End If
      149. CodeEditorControlHaupt.Select()
      150. Catch UnAccess As UnauthorizedAccessException 'Keine Zugriffsrechte
      151. 'Fehlerbericht
      152. frm_Fehler.Fehler_öffnen("Der Zugriff auf eine Datei wurde verweigert.", UnAccess.Message, UnAccess.StackTrace)
      153. 'Ereignisprotokoll
      154. Me.Fehlerprotokoll_Speichern("Der Zugriff auf eine Datei wurde verweigert", 30000, UnAccess.Message, UnAccess.StackTrace)
      155. Catch NotFound As FileNotFoundException 'Datei nicht gefunden
      156. 'Fehlerbericht
      157. frm_Fehler.Fehler_öffnen("Eine Datei wurde nicht gefunden.", NotFound.Message, NotFound.StackTrace)
      158. 'Ereignisprotokoll
      159. Me.Fehlerprotokoll_Speichern("Eine Datei wurde nicht gefunden", 30000, NotFound.Message, NotFound.StackTrace)
      160. Application.Restart()
      161. Catch ex As Exception 'Alle anderen Fehler
      162. 'Fehlerbericht
      163. frm_Fehler.Fehler_öffnen("Ein allgemeiner Fehler wurde verursacht.", ex.Message, ex.StackTrace)
      164. 'Ereignisprotokoll
      165. Me.Fehlerprotokoll_Speichern("Ein allgemeiner Fehler wurde verursacht", 30000, ex.Message, ex.StackTrace)
      166. End Try
      167. End Sub
      168. Protected Overrides Sub WndProc(ByRef m As Message)
      169. 'die messages auswerten
      170. If m.Msg = WM_HOTKEY Then
      171. 'hier wird entschieden welcher hotkey es war
      172. 'einfach die übergebene id auswerten
      173. Select Case m.WParam
      174. Case 1
      175. MsgBox("test")
      176. End Select
      177. End If
      178. MyBase.WndProc(m)
      179. End Sub


      Hier das freigeben:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      2. Try
      3. If CBool(Element_Laden("Close")) = True Then
      4. vBeenden = False
      5. Else
      6. vBeenden = True
      7. End If
      8. If vBeenden = False Then 'Nicht beenden (In Statusleiste schließen)
      9. If CBool(Me.Element_Laden("Close")) = True Then
      10. e.Cancel = True 'Schliesen abbrechen
      11. Me.WindowState = FormWindowState.Minimized 'Minimieren
      12. NotIcn_Main.Visible = True 'Trayicon anzeigen
      13. Me.Visible = False 'Fenster komplett ausblenden
      14. End If
      15. Else 'Beenden
      16. 'Änderung in XML-Datei übernehmen
      17. Dim CurLang As New cls_XML_Change
      18. CurLang.Ändern("/CodeGallery/Language/Current", cmb_Sprache.Text) 'aktuelle Sprache speichern
      19. If Me.WindowState = FormWindowState.Maximized Then
      20. CurLang.Ändern("/CodeGallery/Startoptions/Maximum", True) 'Maximiert?
      21. ElseIf Me.WindowState = FormWindowState.Minimized Then 'Nichts machen wenn minimiert
      22. Else
      23. CurLang.Ändern("/CodeGallery/Startoptions/Maximum", False) 'nicht Maximiert?
      24. CurLang.Ändern("/CodeGallery/Startoptions/Size", Me.Size.Width & "; " & Me.Size.Height) 'Größe speichern
      25. CurLang.Ändern("/CodeGallery/Startoptions/Location", Me.Location.X & "; " & Me.Location.Y) 'Location speichern
      26. End If
      27. '####################################
      28. 'globaler Hotkey wieder freigeben
      29. UnregisterHotKey(Me.Handle, 1)
      30. Application.Exit()
      31. End If
      32. Catch UnAccess As UnauthorizedAccessException 'Keine Zugriffsrechte
      33. MessageBox.Show("Der Zugriff auf eine Datei wurde verweigert:" & vbNewLine & _
      34. UnAccess.Message, "Keine Zugriffsrechte", MessageBoxButtons.OK, MessageBoxIcon.Error)
      35. 'Ereignisprotokoll
      36. Me.Fehlerprotokoll_Speichern("Der Zugriff auf eine Datei wurde verweigert", 30000, UnAccess.Message, UnAccess.StackTrace)
      37. Catch NotFound As FileNotFoundException 'Datei nicht gefunden
      38. MessageBox.Show("Folgende Datei wurde nicht gefunden:" & vbNewLine & _
      39. NotFound.FileName, "Datei nicht gefunden", MessageBoxButtons.OK, MessageBoxIcon.Error)
      40. 'Ereignisprotokoll
      41. Me.Fehlerprotokoll_Speichern("Eine Datei wurde nicht gefunden", 30000, NotFound.Message, NotFound.StackTrace)
      42. Catch ex As Exception 'Alle anderen Fehler
      43. 'Fehlerbericht
      44. frm_Fehler.Fehler_öffnen("Ein allgemeiner Fehler wurde verursacht.", ex.Message, ex.StackTrace)
      45. 'Ereignisprotokoll
      46. Me.Fehlerprotokoll_Speichern("Ein allgemeiner Fehler wurde verursacht", 30000, ex.Message, ex.StackTrace)
      47. End Try
      48. End Sub


      Ich hoffe das hilft weiter.
      wintoolz.de
      • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
      • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
      • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

      Benutze auch du Ecosia
      Du hast das ganze in einem Try-Block, wenn jetzt etwas davor failt, dann wird der nicht registriert, genauso wie beim Freigeben (Trifft auf Post 3/Punkt 1). Pack das aus dem Try raus. Und wenn du .Net benutzt dann ist das Call egal
      Danke das du mal drübergeschaut hast, aber an dem Try-Block liegt es nicht. Ich würde mitbekommen wenn das Try fehlschlägt. Da das aber nicht der Fall ist liegts daran nicht.
      Das mit dem Call ist mir bekannt, für mich ist das aber etwas übersichtlicher als ohne.

      Ich werde die nächsten Tage Punkt für Punkt vorgehen und schauen ob ich etwas finde.
      wintoolz.de
      • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
      • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
      • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

      Benutze auch du Ecosia
      Moin Mike,
      Ich hab da noch ne frage :D
      und zwar über die Keys methode gibt es keine möglichkeit umlaute zu verwenden oder * siehe unten *
      ich bin auf deinen Thread gekommen und hab gedacht das fragsde jetzt mal den Mike :P

      MfG Tobi

      * Meine Tastatur ist kaputt... sowas wie 'Fragezeichen' geht nicht mehr.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tobse101“ ()

      Hallo,

      bin grad ein bischen am Rumspielen mit den Tastatur Hocks.



      Mein Problem ist jetzt, der Hook löst zwar das event beim Tastendruck aus, und erkennt auch die Tasten, aber in dem Programm wo ich die Taste gedrückt habe kommt sie nicht mehr an. Kann also keine eingabe mehr machen.

      Hier mal der Code im Overrides


      VB.NET-Quellcode

      1. Protected Overrides Sub WndProc(ByRef m As Message)
      2. 'die messages auswerten
      3. If m.Msg = WM_HOTKEY Then
      4. 'hier wird entschieden welcher hotkey es war
      5. 'einfach die bergebene id auswertenSelect Case m.WParamCase 1
      6. TextBox1.Text = TextBox1.Text & zeichen(m.WParam)
      7. Case Else
      8. TextBox1.Text = TextBox1.Text & zeichen(m.WParam)
      9. End Select
      10. End IfMyBase.WndProc(m)
      11. End Sub

      Und so werden die Tasten registriert

      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      2. 'die tab taste abfangen
      3. '1 -10for i=48 to 57
      4. registerHotKey(Me.Handle, i-47, Key_NONE, i)zeichen(i-47)=cstr(i-48)
      5. next
      6. '11-36For i = 65 To 90RegisterHotKey(Me.Handle, i - 54, Key_NONE, i)
      7. zeichen(i-54)=chr(i)
      8. NextFor i = 97 To 122RegisterHotKey(Me.Handle, i - 60, Key_NONE, i)
      9. zeichen(i-60)=chr(i)
      10. Next
      11. End Sub


      Bevor bei einem jetzt die Alarmglocken läuten, nein das wird kein KeyLogger sondern ist im Moment nur zum rumspielen mit mehreren Tasten und Wörtern.

      Ziel des ganzen ist reaktionen bei der eingabe von Keywörtern zu bekommen.
      Wers genauer wissen will, das ganze soll auf die Feuerwehrleitstelle und mein Programm mit dem Standard Leitstellen programm verknüpfen.
      Wenn jetzt z.B. Brand eingeben wird erfolgt daraus dann eine reaktion usw.

      Vielen Dank schonmal im vorraus

      Dr Snuggles
      du kannst auf Up und Down reagieren, also musst du nur zwischenspeichern ob Strg gedrückt ist und wenn das der Fall ist auf PageUp reagieren...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Dann funktioniert das aber doch nur wenn man die Tasten in der Reihenfolge drückt, und außerdem wennman einen zeitlichen abstand dazwischen hat...

      vll. verstehe ich dich auch falsch, kannst du mal ein codebeispiel machen?
      Kann man auch irgendwie überprüfen ob eine Taste losgelassen wurde?
      Und ich hab noch ne Frage, wenn ich jetzt groß schreiben will, registriert er die Keys noch nicht mal. Gibts dafür ne Lösung?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rinecamo“ ()

      Das abfangen der Tasten funktioniert, aber wenn ich eine Taste gedrückt halte wird diese immer wieder weitergegeben.
      Wie kann ich den Code umbauen das erst beim loslassen reagiert wird? Oder füge ich am besten eine Warte Funktion ein.

      Zufallstaste basierend auf einem Tastaturhook

      Hallo Mike69

      Ich würde gerne eine Zufallstaste auf der Tastatur erstellen. Zum Beispiel wenn ich Z drücke, soll der Taste ein zufälliger Buchstabe zugeordnet werden. Ich dachte, man müsste statt der Messagebox einfach den Wert der windows-Message löschen und einen Beliebigen Wert in die Message einfügen und sie dann weiterleiten. Aber bei mir funktioniert das nicht. Hättest Du vielleicht eine Lösung für das Problem?


      Nobodyy