Hotkeyprogramm - Umschalttaste+Windowstaste+Pfeiltaste links/rechts ausführen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Joshi.

    Hotkeyprogramm - Umschalttaste+Windowstaste+Pfeiltaste links/rechts ausführen

    Hallo zusammen,

    schreibe mir gerade ein kleines Hotkey-Programm.

    Nun möchte ich mit der Rollentaste oder Drucktaste das Drücken der o. g. Tastenkombination auslösen.

    Durch diese Tastenkombination kann man ja das aktive Programm von einem Monitor auf den anderen legen.

    Leiden habe ich nichts gefunden, wie man die Tastenkombination ausführen kann. Oder gibt es sogar eine Möglichkeit diese Aktion anders auszuführen?

    Die Drucktaste kann ich mit RegisterHotKey(Me.Handle, 4, KeyModifier.Keine, Keys.PrintScreen) abfangen.

    - Kann mir jemand helfen, wie man einmal die Rollentaste abfangen kann und
    - dann die o. g. Tastenkombination ausführt?

    Hier Windows Taste simulieren mit sendkeys (letzter Post) funktioniert zwar die Windowstaste, aber ich benötige ja eine 3er Tastenkombination

    Wäre schön, wenn mir jemand helfen könnte.

    Freundliche Grüße

    Volker
    Hi @Volker Bunge

    Die Umschalttaste und die Windowstaste sind Modifier, also beide zusammen.
    Beim Senden einer Tastenkombination werden die Modifier mit einem logischen Oder-Operator zu einem Wert zusammengesetzt.
    Dieses wird im Betriebssystem auch so erwartet.

    Also bei deinem Beispiel:

    VB.NET-Quellcode

    1. RegisterHotKey(Me.Handle, 4, KeyModifier.Win Or KeyModifier.Shift, Keys.PrintScreen)


    OOODER... es ist dann doch ein AND

    Und hier ein Link zur Liste der Windows Keys.
    docs.microsoft.com/de-de/dotne…&viewFallbackFrom=net-6.0

    Kann mich gerade nicht so gut erinnern wie genau, aber überm Daumen die Windows-Taste und so... und, oder, aber... ;)

    Viel Erfolg und c.u Joshi
    Hallo Joshi,

    sorry, dass ich mich jetzt erst melde. Es kam mal wieder viele andere Dinge dazwischen.

    Mit RegisterHotKey registriert man doch nur eine Taste und kann diese dann mit der 4 (als Beispiel) in einer Select-Case auswerten.

    Ich möchte aber, dass beim drücken der Printtaste das aktuelle Programm auf einen anderen Monitor verschoben wird. Das kann man normaler weise mit Shift+Windowstaste und den Pfeiltasten Links/Rechts erledigen.

    Die Lösung kann auch über das ermitteln des aktuellen Programmes gehen, welches dann über eine Verschieberoutine auf einen anderen Monitor verschoben wird, gelöst werden. Die Tastenkombination wird aber wahrscheinlich die einfachste Lösung sein.

    Hast Du, oder jemand anderes hier eine Lösung für mich?

    Gruß
    Volker
    Hi @Volker Bunge

    Auf dem Handle des aktiven Fensters (oder vielleicht Control),
    das Keypress-Event des Hotkeys (Drucken-Taste) abfangen und
    als Handled = True setzen,
    dann den gewünschten Aufruf (Sende Bildschirm wechsel Anweisung) ausführen.

    Wie ein Relay; schaltet etwas ein, dann was Anderes/Zusätzliches (evtl. Mehrere Operationen) ausführen.

    Ich mache sonst keine Verweise auf StackOverflow, aber dort ist eine Implementierung in VB zu finden.

    stackoverflow.com/a/34755545/5955856

    Fragestellung: Set global hotkeys using C#

    Weiter unten ist die VB-Version.

    c.u. Joshi TLDR; :D
    Hallo Joshi,

    vielen Dank für Deine Antwort,

    Wenn ich das richtig verstanden habe, zielt Deine Antwort auf das Verschieben einer VB.Net Lösung ab.

    Ich möchte aber mit meiner VB.Net Lösung das gerade aktive Programm (Chrome, Word, Excel usw.) auf den Monitoren hin und her bewegen. Dort kann ich ja leider, so wie Du es beschreibst, leider nicht eingreifen.

    Wie gesagt: Wenn ich die Print-Taste drücke, dann reagiert mein Programm (zum Testen habe ich eine MSGBox eingebaut). Ich suche jetzt eigentlich nur noch eine Möglichkeit, die Tastenkombination Shift+Windowstaste+Linke/Rechte Pfeiltaste zu simulieren, so dass sich das aktuelle Programm über die Monitore bewegt.

    Gruß

    Volker
    Hallo Joshi,

    habe gerade die Lösung gefunden.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
    2. ' keybd_event dwFlags-Konstanten
    3. Public Const KEYEVENTF_EXTENDEDKEY = &H1 ' Erweiterte Tastatureingabe
    4. Public Const KEYEVENTF_KEYUP = &H2 ' Die angegebene Taste wird losgelassen
    5. ' GetAsyncKeyState vKey-Konstanten
    6. Public Const VK_LWIN = &H5B ' Windows-Taste
    7. Public Const VK_SHIFT = &H10 ' Shift Taste
    8. Public Const VK_LEFT = &H25 ' Linke Pfeiltaste
    9. keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY , 0) ' Umschalt-Taste
    10. keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY , 0) ' Windows-Taste
    11. keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY , 0) ' Linke Pfeiltaste-Taste
    12. keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
    13. keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
    14. keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0)


    So, werde es morgen noch einmal alles testen und hoffe, dass mein Programm damit fertig ist.

    Gruß

    Volker

    *Korrekten Code-Tag eingefügt*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Moinsen. @Volker Bunge

    Genau so geht das mit den Tastaturanschlägen.

    Könntest Du uns allen ein Gefallen tun?

    Wenn Du fertig hast, einmal für alle Bildschirm Richtungen den Quellcode hier reinstellen?

    Soweit ich mich erinnern kann sind diese Aufgaben so häufig in der Fragestellung, dass alle Suchmaschinen darunter ächzen. :)

    Danke Dir im Voraus.

    c.u. Joshi mit Kaffe und so...
    Hallo Joshi,

    habe gerade noch meinen Code von oben ein wenig geändert.

    aus 0, 0, 0 wurde 0, KEYEVENTF_EXTENDEDKEY, 0. Hatte nämlich heute morgen das Problem, dass mein Programm nicht mehr so wollte wie gestern.

    Hoffe jetzt, dass es jetzt klappt.

    Werde den Code hier noch einmal einstellen. Aber zuvor wird noch auf ein paar anderen Rechnern getestet.

    Ich wollte evtl. noch ein Video drehen und werde es dann auch hier verlinken.

    Gruß
    Volker
    Ich sehe, dass ich das Thema viel zu lange nicht gelesen habe.
    Solch ein Problem würde ich nicht per Hotkeydatensenden lösen, sondern per UIAutomation. Einfach dem Fenster den Befehl geben: Beweg Dich woanders hin.
    Ausführlich habe ich sowas in externe .Net-Programme auslesen und manipulieren beschrieben.

    Zuerst die Zielkoordinaten ermitteln:

    VB.NET-Quellcode

    1. Dim OtherScreen = Screen.AllScreens.FirstOrDefault(Function(x) Not x.Primary) 'hier als Beispiel: Den ersten Nichtprimärscreen hernehmen, um das Fenster später dorthin zu verschieben
    2. Dim Zielkoordinaten As Drawing.Point = New Drawing.Point(0, 0)
    3. If OtherScreen.Exists Then Zielkoordinaten = OtherScreen.Bounds.Location

    und dann:

    VB.NET-Quellcode

    1. Dim ZielApp = AutomationElement.RootElement.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.NameProperty, TitelDerZielApp))
    2. ZielApp?.TryToGetPattern(Of TransformPattern)?.Move(Zielkoordinaten.X, Zielkoordinaten.Y)


    ##########

    Aber Moment. Wenn es darum geht, das sich das eigene Programm umplatziert, geht es noch viel einfacher:

    VB.NET-Quellcode

    1. Dim OtherScreen = Screen.AllScreens.FirstOrDefault(Function(x) Not x.Primary) 'hier als Beispiel: Den ersten Nichtprimärscreen hernehmen, um das Fenster später dorthin zu verschieben
    2. If OtherScreen IsNot Nothing Then Me.Location = OtherScreen.Bounds.Location

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo zusammen,

    hier nun mal der Code von meinem Hotkey-Programm mit Erklärungen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Wird für das Warten benötigt
    2. Imports System.Threading
    3. ' Für das Einstellen der Autostartfunktion
    4. Imports Microsoft.Win32
    5. Module Deklarationen
    6. #Region "Ein paar Deklarationen"
    7. ' Diese Funktion wird für die Tastendefinition benötigt
    8. Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
    9. Public Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
    10. ' Es wird ein Verweis auf den Registry-Schlüssel Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run gesetzt.
    11. ' In diesem Zweig sind alle Autostartprogramme aufgeführt
    12. Public RegKey As Microsoft.Win32.RegistryKey = Registry.CurrentUser.CreateSubKey("Software\Microsoft\Windows\CurrentVersion\Run")
    13. ' keybd_event dwFlags-Konstanten
    14. Public Const KEYEVENTF_EXTENDEDKEY = &H1 ' Erweiterte Tastatureingabe
    15. Public Const KEYEVENTF_KEYUP = &H2 ' Die angegebene Taste wird losgelassen
    16. ' Eine Konstante für den späteren Abgleich festlegen
    17. Public Const WM_HOTKEY As Integer = &H312
    18. ' Festhalten, ob das Programm gestartet wurde
    19. Public Programmstart As Boolean
    20. ' Damit wird eine Warteschleife ermöglicht zu starten
    21. Public Warten As New ManualResetEvent(False)
    22. Public Enum KeyModifier
    23. ' Werteliste für die möglichen Zusatztasten festlegen
    24. Keine = 0
    25. Alt = 1
    26. Control = 2
    27. Shift = 4
    28. End Enum
    29. #End Region
    30. #Region "Tastaturwerte"
    31. ' Herkunft: https://www.vbarchiv.net/api/api_kybd_event.html
    32. ' Die Werte für die einzelnen Tasten
    33. ' Hier die benötigten Tastenwerte
    34. Public Const VK_C = &H43 ' Taste C
    35. Public Const VK_V = &H56 ' Taste V
    36. Public Const VK_X = &H58 ' Taste X
    37. Public Const VK_S = &H53 ' Taste S
    38. Public Const VK_LWIN = &H5B ' Windows-Taste
    39. Public Const VK_SHIFT = &H10 ' Shift Taste
    40. Public Const VK_LEFT = &H25 ' Linke Pfeiltaste
    41. ' Public Const VK_RIGHT = &H27 ' Rechte Pfeiltaste
    42. ' und hier alle weiteren, die möglich sind
    43. Public Const VK_LBUTTON = &H1 ' Linker Mausbutton
    44. Public Const VK_RBUTTON = &H2 ' Rechter Mausbutton
    45. Public Const VK_MBUTTON = &H4 ' Mittlerer Masubutton
    46. Public Const VK_BACK = &H8 ' Backspace Taste
    47. Public Const VK_TAB = &H9 ' Tab Taste
    48. Public Const VK_CLEAR = &HC ' Numpad 5 ohne Numlock
    49. Public Const VK_RETURN = &HD ' Enter Taste
    50. Public Const VK_CONTROL = &H11 ' STRG Taste
    51. Public Const VK_MENU = &H12 ' Alt Taste
    52. Public Const VK_PAUSE = &H13 ' Pause/Untbr
    53. Public Const VK_CAPITAL = &H14 ' Caps Lock/Feststelltaste
    54. Public Const VK_ESCAPE = &H1B ' Escape
    55. Public Const VK_SPACE = &H20 ' Space/Leertaste
    56. Public Const VK_PRIOR = &H21 ' PageUp/Bild hoch
    57. Public Const VK_NEXT = &H22 ' PageDown/Bild runter
    58. Public Const VK_END = &H23 ' Ende
    59. Public Const VK_HOME = &H24 ' Home/Pos1
    60. Public Const VK_UP = &H26 ' Obere Pfeilaste
    61. Public Const VK_DOWN = &H28 ' Untee Pfeiltaste
    62. Public Const VK_PRINT = &H2A ' Drucken (Nokia Tastaturen)
    63. Public Const VK_SNAPSHOT = &H2C ' Drucken/S-Abf
    64. Public Const VK_INSERT = &H2D ' Einfügen
    65. Public Const VK_DELETE = &H2E ' Entfernen
    66. Public Const VK_HELP = &H2F ' Hilfe
    67. Public Const VK_0 = &H30 ' Taste 0
    68. Public Const VK_1 = &H31 ' Taste 1
    69. Public Const VK_2 = &H32 ' Taste 2
    70. Public Const VK_3 = &H33 ' Taste 3
    71. Public Const VK_4 = &H34 ' Taste 4
    72. Public Const VK_5 = &H35 ' Taste 5
    73. Public Const VK_6 = &H36 ' Taste 6
    74. Public Const VK_7 = &H37 ' Taste 7
    75. Public Const VK_8 = &H38 ' Taste 8
    76. Public Const VK_9 = &H39 ' Taste 9
    77. Public Const VK_A = &H41 ' Taste A
    78. Public Const VK_B = &H42 ' Taste B
    79. Public Const VK_D = &H44 ' Taste D
    80. Public Const VK_E = &H45 ' Taste E
    81. Public Const VK_F = &H46 ' Taste F
    82. Public Const VK_G = &H47 ' Taste G
    83. Public Const VK_H = &H48 ' Taste H
    84. Public Const VK_I = &H49 ' Taste I
    85. Public Const VK_J = &H4A ' Taste J
    86. Public Const VK_K = &H4B ' Taste K
    87. Public Const VK_L = &H4C ' Taste L
    88. Public Const VK_M = &H4D ' Taste M
    89. Public Const VK_N = &H4E ' Taste N
    90. Public Const VK_O = &H4F ' Taste O
    91. Public Const VK_P = &H50 ' Taste P
    92. Public Const VK_Q = &H51 ' Taste Q
    93. Public Const VK_R = &H52 ' Taste R
    94. Public Const VK_T = &H54 ' Taste T
    95. Public Const VK_U = &H55 ' Taste U
    96. Public Const VK_W = &H57 ' Taste W
    97. Public Const VK_Y = &H59 ' Taste Y
    98. Public Const VK_Z = &H5A ' Taste Z
    99. Public Const VK_STARTKEY = &H5B ' Startmenütaste
    100. Public Const VK_CONTEXTKEY = &H5D ' Kentextmenü
    101. Public Const VK_NUMPAD0 = &H60 ' Numpad Taste 0
    102. Public Const VK_NUMPAD1 = &H61 ' Numpad Taste 1
    103. Public Const VK_NUMPAD2 = &H62 ' Numpad Taste 2
    104. Public Const VK_NUMPAD3 = &H63 ' Numpad Taste 3
    105. Public Const VK_NUMPAD4 = &H64 ' Numpad Taste 4
    106. Public Const VK_NUMPAD5 = &H65 ' Numpad Taste 5
    107. Public Const VK_NUMPAD6 = &H66 ' Numpad Taste 6
    108. Public Const VK_NUMPAD7 = &H67 ' Numpad Taste 7
    109. Public Const VK_NUMPAD8 = &H68 ' Numpad Taste 8
    110. Public Const VK_NUMPAD9 = &H69 ' Numpad Taste 9
    111. Public Const VK_MULTIPLY = &H6A ' Numpad Multiplikations Taste (*)
    112. Public Const VK_ADD = &H6B ' Numpad Additions Taste (+)
    113. Public Const VK_SUBTRACT = &H6D ' Numpad Subtrations Taste (-)
    114. Public Const VK_DECIMAL = &H6E ' Numpad Komma Taste (,)
    115. Public Const VK_DIVIDE = &H6F ' Numpad Devidierungs Taste (/)
    116. Public Const VK_F1 = &H70 ' F1 Taste
    117. Public Const VK_F2 = &H71 ' F2 Taste
    118. Public Const VK_F3 = &H72 ' F3 Taste
    119. Public Const VK_F4 = &H73 ' F4 Taste
    120. Public Const VK_F5 = &H74 ' F5 Taste
    121. Public Const VK_F6 = &H75 ' F6 Taste
    122. Public Const VK_F7 = &H76 ' F7 Taste
    123. Public Const VK_F8 = &H77 ' F8 Taste
    124. Public Const VK_F9 = &H78 ' F9 Taste
    125. Public Const VK_F10 = &H79 ' F10 Taste
    126. Public Const VK_F11 = &H7A ' F11 Taste
    127. Public Const VK_F12 = &H7B ' F12 Taste
    128. Public Const VK_F13 = &H7C ' F13 Taste
    129. Public Const VK_F14 = &H7D ' F14 Taste
    130. Public Const VK_F15 = &H7E ' F15 Taste
    131. Public Const VK_F16 = &H7F ' F16 Taste
    132. Public Const VK_F17 = &H80 ' F17 Taste
    133. Public Const VK_F18 = &H81 ' F18 Taste
    134. Public Const VK_F19 = &H82 ' F19 Taste
    135. Public Const VK_F20 = &H83 ' F20 Taste
    136. Public Const VK_F21 = &H84 ' F21 Taste
    137. Public Const VK_F22 = &H85 ' F22 Taste
    138. Public Const VK_F23 = &H86 ' F23 Taste
    139. Public Const VK_F24 = &H87 ' F24 Taste
    140. Public Const VK_NUMLOCK = &H90 ' Numlock Taste
    141. Public Const VK_OEM_SCROLL = &H91 ' Scroll Lock (Rollen-Taste)
    142. Public Const VK_LSHIFT = &HA0 ' Linke Shift-Taste
    143. Public Const VK_RSHIFT = &HA1 ' Rechte Shift-Taste
    144. Public Const VK_LCONTROL = &HA2 ' Linke STRG-Taste
    145. Public Const VK_RCONTROL = &HA3 ' Rechte STRG-Taste
    146. Public Const VK_LMENU = &HA4 ' Linke ALT-Taste
    147. Public Const VK_RMENU = &HA5 ' Rechte ALT-Taste
    148. Public Const VK_OEM_1 = &HBA ' ";"-Taste
    149. Public Const VK_OEM_PLUS = &HBB ' "
    150. Public Const VK_OEM_COMMA = &HBC ' ","-Taste
    151. Public Const VK_OEM_MINUS = &HBD ' "-"-Taste
    152. Public Const VK_OEM_PERIOD = &HBE ' "."-taste
    153. Public Const VK_OEM_2 = &HBF ' "/"-Taste
    154. Public Const VK_OEM_3 = &HC0 ' "`"-Taste
    155. Public Const VK_OEM_4 = &HDB ' "["-Taste
    156. Public Const VK_OEM_5 = &HDC ' "\"-Taste
    157. Public Const VK_OEM_6 = &HDD ' "]"-Taste
    158. Public Const VK_OEM_7 = &HDE ' "
    159. Public Const VK_ICO_F17 = &HE0 ' F17 einer Olivetti Tastatur (Intern)
    160. Public Const VK_ICO_F18 = &HE1 ' F18 einer Olivetti Tastatur (Intern)
    161. Public Const VK_OEM102 = &HE2 ' "<"-Taste oder "|"-Taste einer ' IBM-Kompatiblen 102 Tastatur (Nicht US)
    162. Public Const VK_ICO_HELP = &HE3 ' Hilfetaste einer Olivetti Tastatur ' (Intern)
    163. Public Const VK_ICO_00 = &HE4 ' 00-Taste einer Olivetti Tastatur (Intern)
    164. Public Const VK_ICO_CLEAR = &HE6 ' Löschen Taste einer Olivetti Tastatur ' (Intern)
    165. Public Const VK_OEM_RESET = &HE9 ' Reset Taste (Nokia)
    166. Public Const VK_OEM_JUMP = &HEA ' Springen Taste (Nokia)
    167. Public Const VK_OEM_PA1 = &HEB ' PA1 Taste (Nokia)
    168. Public Const VK_OEM_PA2 = &HEC ' PA2 Taste (Nokia)
    169. Public Const VK_OEM_PA3 = &HED ' PA3 Taste (Nokia)
    170. Public Const VK_OEM_WSCTRL = &HEE ' WSCTRL Taste (Nokia)
    171. Public Const VK_OEM_CUSEL = &HEF ' WSCTRL Taste (Nokia)
    172. Public Const VK_OEM_ATTN = &HF0 ' ATTN Taste (Nokia)
    173. Public Const VK_OEM_FINNISH = &HF1 ' Fertig Taste (Nokia)
    174. Public Const VK_OEM_COPY = &HF2 ' Kopieren Taste (Nokia)
    175. Public Const VK_OEM_AUTO = &HF3 ' Auto Taste (Nokia)
    176. Public Const VK_OEM_ENLW = &HF4 ' ENLW Taste (Nokia)
    177. Public Const VK_OEM_BACKTAB = &HF5 ' BackTab Taste (Nokia)
    178. Public Const VK_ATTN = &HF6 ' ATTN-Taste
    179. Public Const VK_CRSEL = &HF7 ' CRSEL-Taste
    180. Public Const VK_EXSEL = &HF8 ' EXSEL-Taste
    181. Public Const VK_EREOF = &HF9 ' EREOF-Taste
    182. Public Const VK_PLAY = &HFA ' PLAY-Taste
    183. Public Const VK_ZOOM = &HFB ' ZOOM-Taste
    184. Public Const VK_NONAME = &HFC ' NONAME-Taste
    185. Public Const VK_PA1 = &HFD ' PA1-Taste
    186. Public Const VK_OEM_CLEAR = &HFE ' OEM_CLEAR-Taste
    187. #End Region
    188. End Module


    Spoiler anzeigen

    Quellcode

    1. Public Class Form1
    2. #Region "Hauptteil"
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. ' Das Programm wurde gestartet
    5. Programmstart = True
    6. ' Die Checkboxen für die Möglichkeiten werden wieder so eingestellt, wie sie beim letzten Verlassen waren
    7. Call Checkboxen_wiederherstellen()
    8. ' Das Icon links neben der Uhr anzeigen
    9. NotifyIcon1.Visible = True
    10. ' Die Auswahl - Form wird ausgeblendet
    11. Me.Hide()
    12. ' Wenn das Programm gestartet wird dieser Hinweis für x Sekunden angezeigt
    13. ' HINWEIS: Falls kein Text angezeigt wird, dann bei Windows 10 mal ganz unten rechts auf das Symbol klicken und bei Benachrichtigung & Aktionen suchen
    14. ' Der Benachrichtigungsasistant sollte grau sein.
    15. ' In der Liste der Programme sollte dieses hier eingeschaltet sein.
    16. ' So
    17. If My.Settings.Hinweistext_Anzeigen = True Then
    18. ' NotifyIcon1.ShowBalloonTip(my.settings.Hinweistext_Anzeigen_Sekunden*1000)
    19. ' NotifyIcon1.BalloonTipTitle = "VB Hotkeys"
    20. ' NotifyIcon1.BalloonTipText = "Volker Bunge's Hotkeyprogramm ist gestartet"
    21. ' NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info
    22. ' oder kürzer
    23. NotifyIcon1.ShowBalloonTip(My.Settings.Hinweistext_Anzeigen_Sekunden * 1000, "VB Hotkeys", "Volker Bunge's Hotkeyprogramm ist gestartet", ToolTipIcon.Info)
    24. End If
    25. ' Das Programm wird in der Taskleiste nicht angezeigt
    26. ShowInTaskbar = False
    27. ' Die Tasten werden festgelegt (Sollte möglichst am Ende erfolgen, da es sonst nicht funktionieren könnte)
    28. Call Tasten_festlegen()
    29. ' Die globale Variable wird wieder zurück gesetzt
    30. Programmstart = False
    31. End Sub
    32. Sub Checkboxen_wiederherstellen()
    33. ' Die zuletzt eingestellten Werte der Checkboxen werden aus den Internen My.Settingvariablen wiederhergestellt.
    34. CBox_STRG_C.Checked = My.Settings.Taste_STRG_C
    35. CBox_STRG_V.Checked = My.Settings.Taste_STRG_V
    36. CBox_Umschalt_Enter.Checked = My.Settings.Taste_STRG_X
    37. CBox_STRG_S.Checked = My.Settings.Taste_STRG_S
    38. CBox_Drucktaste.Checked = My.Settings.Taste_Drucken
    39. CBox_Rollentaste.Checked = My.Settings.Taste_Rollen
    40. CBox_Hinweis_Ballon_anzeigen.Checked = My.Settings.Hinweistext_Anzeigen
    41. TBox_Hinweistext_Anzeigedauer.Text = CStr(My.Settings.Hinweistext_Anzeigen_Sekunden) ' So, wenn Option Strict = On ist, ansonsten reicht auch My.Settings.Hinweistext_Anzeigen_Sekunden
    42. CBox_Autostart.Checked = My.Settings.Autostart
    43. ' Das Icon wird noch schnell anpasst
    44. Call TrayIcon_anpassen()
    45. End Sub
    46. Sub Checkboxen_sichern()
    47. ' Hier werden die aktuellen Einstellungen in den internen Variablen gesichert
    48. My.Settings.Taste_STRG_C = CBox_STRG_C.Checked
    49. My.Settings.Taste_STRG_V = CBox_STRG_V.Checked
    50. My.Settings.Taste_STRG_X = CBox_Umschalt_Enter.Checked
    51. My.Settings.Taste_STRG_S = CBox_STRG_S.Checked
    52. My.Settings.Taste_Drucken = CBox_Drucktaste.Checked
    53. My.Settings.Taste_Rollen = CBox_Rollentaste.Checked
    54. My.Settings.Hinweistext_Anzeigen = CBox_Hinweis_Ballon_anzeigen.Checked
    55. My.Settings.Hinweistext_Anzeigen_Sekunden = CInt(TBox_Hinweistext_Anzeigedauer.Text) ' So, wenn Option Strict = On ist, ansonsten reicht auch TBox_Hinweistext_Anzeigedauer.Text
    56. My.Settings.Autostart = CBox_Autostart.Checked
    57. My.Settings.Save()
    58. End Sub
    59. Sub TrayIcon_anpassen()
    60. ' Je nachdem, welche Tastenkombinationen gewählt wurde, wird das Programmicon geändert
    61. If My.Settings.Taste_Drucken = True Then
    62. ' Bei der Druckentaste
    63. If My.Settings.Taste_STRG_C = True Then
    64. ' Wenn die STRG + C Taste per STRG - Taste gedrückt wird, wird das schwarze D angezeigt
    65. Me.NotifyIcon1.Icon = My.Resources.Icon_schwarz_D
    66. Else
    67. ' Wenn die STRG + S Taste per STRG - Taste gedrückt wird, wird das rote D angezeigt
    68. Me.NotifyIcon1.Icon = My.Resources.Icon_rot_D
    69. End If
    70. Else
    71. ' Bei der Rollentaste
    72. If My.Settings.Taste_STRG_C = True Then
    73. ' Wenn die STRG + C Taste per STRG - Taste gedrückt wird, wird das schwarze D angezeigt
    74. Me.NotifyIcon1.Icon = My.Resources.Icon_schwarz_R
    75. Else
    76. ' Wenn die STRG + S Taste per STRG - Taste gedrückt wird, wird das rote D angezeigt
    77. Me.NotifyIcon1.Icon = My.Resources.Icon_rot_R
    78. End If
    79. End If
    80. End Sub
    81. Sub Tasten_festlegen()
    82. ' Hier werden die Tasten bzw. deren Kombinationen festgelegt
    83. ' Me.Handle ist das aktuelle Formular
    84. ' 1-4 sind die späteren Indexe
    85. ' danach folgen die KeyModifier-Tasten
    86. ' zum Schluss noch die "normalen" Tasten per Keys (Wenn keine weitere "normale" Taste benötigt wird, dann wird diess mit KeyModifier.Keine eingestellt
    87. RegisterHotKey(Me.Handle, 1, KeyModifier.Control, KeyModifier.Keine) ' STRG - Taste
    88. RegisterHotKey(Me.Handle, 2, KeyModifier.Control + KeyModifier.Shift, KeyModifier.Keine) ' STRG + Umschalttastee
    89. RegisterHotKey(Me.Handle, 3, KeyModifier.Shift, Keys.Enter) ' Umschalttaste + Enter
    90. ' RegisterHotKey(Me.Handle, 3, KeyModifier.Shift, Keys.OemQuestion) ' Umschalt und die #' - Taste (Im amerikanischen ist hier das Fragezeichen zu finden=
    91. ' Hier nun entweder die Drucktaste oder die Rollentaste aktivieren
    92. If My.Settings.Taste_Drucken = True Then
    93. RegisterHotKey(Me.Handle, 4, KeyModifier.Keine, Keys.PrintScreen) ' Drucktaste
    94. Else
    95. RegisterHotKey(Me.Handle, 4, KeyModifier.Keine, Keys.Scroll) ' Rollentaste
    96. End If
    97. End Sub
    98. Protected Overrides Sub WndProc(ByRef m As Message)
    99. ' Hier werden nun die Tastendrücke ausgewertet
    100. If m.Msg = WM_HOTKEY Then
    101. ' Wurde ein Hotkey gedrückt
    102. Select Case CInt(m.WParam) ' So, wenn Option Strict = On ist, ansonsten reicht auch m.WParam
    103. ' Dann werden hier die einzelnen Indiezes ausgewertet
    104. Case 1 ' STRG-Taste
    105. ' Da hier zwei Funktionen möglich sind, wird erst einmal die erste überprüft
    106. If My.Settings.Taste_STRG_C = True Then
    107. ' Die jeweilige Aktion wird hier nun ausgeführt
    108. ' SendKeys.SendWait("^c")
    109. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    110. keybd_event(VK_C, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    111. ' und wieder loslassen
    112. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    113. keybd_event(VK_C, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    114. Else
    115. ' und dann die zweite
    116. ' Die jeweilige Aktion wird hier nun ausgeführt
    117. ' SendKeys.SendWait("^s")
    118. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    119. keybd_event(VK_S, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    120. ' und wieder loslassen
    121. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    122. keybd_event(VK_S, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    123. End If
    124. Case 2 'STRG- + Umschalttaste
    125. If My.Settings.Taste_STRG_V = True Then
    126. ' Die jeweilige Aktion wird hier nun ausgeführt
    127. ' SendKeys.SendWait("^v")
    128. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    129. keybd_event(VK_V, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    130. ' und wieder loslassen
    131. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    132. keybd_event(VK_V, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    133. End If
    134. Case 3 ' Umschalt- + Entertaste
    135. If My.Settings.Taste_STRG_X = True Then
    136. ' Die jeweilige Aktion wird hier nun ausgeführt
    137. 'SendKeys.SendWait("^x")
    138. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    139. keybd_event(VK_X, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    140. ' und wieder loslassen
    141. keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    142. keybd_event(VK_X, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    143. End If
    144. Case 4 ' Drucken- oder Rollentaste
    145. ' Hier wird ein entsprechender Hinweistext je nach der gedrückten Taste (Drucken oder Rollen) angezeigt
    146. If My.Settings.Hinweistext_Anzeigen = True Then
    147. If My.Settings.Taste_Drucken = True Then
    148. NotifyIcon1.ShowBalloonTip(My.Settings.Hinweistext_Anzeigen_Sekunden * 1000, "VB Hotkeys", "Das aktuelle Programm wurde über die Drucktaste auf einen anderen Monitor verschoben", ToolTipIcon.Info)
    149. Else
    150. NotifyIcon1.ShowBalloonTip(My.Settings.Hinweistext_Anzeigen_Sekunden * 1000, "VB Hotkeys", "Das aktuelle Programm wurde über die Rollentaste auf einen anderen Monitor verschoben", ToolTipIcon.Info)
    151. End If
    152. End If
    153. ' Die drei notwendigen Tasten drücken
    154. keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Umschalt-Taste
    155. keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Windows-Taste
    156. keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0) ' Linke Pfeiltaste-Taste
    157. ' und wieder loslassen
    158. keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    159. keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    160. keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0)
    161. End Select
    162. ' Nun wird noch die Tastennachricht zurückgesetzt
    163. m.Msg = Nothing
    164. ' und für 1 Sekunde gewartet
    165. ' Waiter.WaitOne(1000) ' Angaben in Millisekunden
    166. End If
    167. ' Werte die nächsten Tasten aus.
    168. MyBase.WndProc(m)
    169. End Sub
    170. #End Region
    171. #Region "Weitere Möglichkeiten"
    172. Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
    173. ' Wenn auf das Icon mit einem Doppelklick gedrückt wird, dann
    174. ' wird das Programm angezeigt
    175. Me.Show()
    176. ' Die Fenstergröße auf Normal gestellt
    177. Me.WindowState = FormWindowState.Normal
    178. End Sub
    179. Private Sub CBox_STRG_S_CheckedChanged(sender As Object, e As EventArgs) Handles CBox_STRG_S.CheckedChanged
    180. ' Da durch, das es 4 Checkboxen gibt, sind aber nur jeweils folgende Einstellungen möglich
    181. ' 1. Die ersten 3 alle oder ein Teil davon
    182. ' 2. Nur die 4te und die ersten 3 alle nicht
    183. ' Da der Aufruf über das Ändern der Checkbox erfolgt, kommt der Aufruf hier auch zustande, wenn die Checkboxen wiederhergestellt werden.
    184. ' Ohne diese Hilfsvariable kommt es zu einer Endlosschleife und somit zu einem permanenten Neustart des Programmes
    185. If Programmstart = False Then
    186. ' dann werden nun die 4 Checkboxen gewechselt
    187. If Me.CBox_STRG_S.Checked = True Then
    188. ' Wenn also nur die eine Tastenkombination möglich sein soll, dann werden die anderen 3 deaktiviert
    189. Me.CBox_STRG_C.Checked = False
    190. Me.CBox_STRG_V.Checked = False
    191. Me.CBox_Umschalt_Enter.Checked = False
    192. ' Die Einstellungen werden gesichert
    193. Call Checkboxen_sichern()
    194. ' Ein kleiner Hinweis wird angezeigt
    195. MsgBox("Das Programm wird nun wegen der Änderungen der Tastenfunktionen beendet. Das Programm wird nun neu gestartet, um die neuen Möglichkeiten zu nutzen")
    196. ' Und das Programm wird mit den jetzt neuen Einstellungen kurz neu gestartet.
    197. ' Dadurch funktioniern dann die neuen Kombinationen
    198. Application.Restart()
    199. Else
    200. ' Andernfall werden die ersten drei Möglichkeiten alle aktiviert
    201. Me.CBox_STRG_C.Checked = True
    202. Me.CBox_STRG_V.Checked = True
    203. Me.CBox_Umschalt_Enter.Checked = True
    204. ' Die Einstellungen werden gesichert
    205. Call Checkboxen_sichern()
    206. ' Ein kleiner Hinweis wird angezeigt
    207. MsgBox("Das Programm wird nun wegen der Änderungen der Tastenfunktionen beendet. Das Programm wird nun neu gestartet, um die neuen Möglichkeiten zu nutzen")
    208. ' Und das Programm wird mit den jetzt neuen Einstellungen kurz neu gestartet.
    209. ' Dadurch funktioniern dann die neuen Kombinationen
    210. Application.Restart()
    211. End If
    212. End If
    213. End Sub
    214. Private Sub CBox_Drucktaste_CheckedChanged(sender As Object, e As EventArgs) Handles CBox_Drucktaste.CheckedChanged
    215. ' Da der Aufruf über das Ändern der Checkbox erfolgt, kommt der Aufruf hier auch zustande, wenn die Checkboxen wiederhergestellt werden.
    216. ' Ohne diese Hilfsvariable kommt es zu einer Endlosschleife und somit zu einem permanenten Neustart des Programmes
    217. If Programmstart = False Then
    218. If CBox_Drucktaste.Checked = True Then
    219. CBox_Rollentaste.Checked = False
    220. Else
    221. CBox_Rollentaste.Checked = True
    222. End If
    223. ' Die aktuellen Einstellungen sichern
    224. Call Checkboxen_sichern()
    225. ' Ein kleiner Hinweis wird angezeigt
    226. MsgBox("Das Programm wird nun wegen der Änderungen der Tastenfunktionen beendet. Das Programm wird nun neu gestartet, um die neuen Möglichkeiten zu nutzen")
    227. ' Und das Programm wird mit den jetzt neuen Einstellungen kurz neu gestartet.
    228. ' Dadurch funktioniern dann die neuen Kombinationen
    229. Application.Restart()
    230. End If
    231. End Sub
    232. Private Sub CBox_Autostart_CheckedChanged(sender As Object, e As EventArgs) Handles CBox_Autostart.CheckedChanged
    233. If CBox_Autostart.Checked = True Then
    234. Try
    235. ' Der entsprechende Eintrag wird vorgenommen
    236. ' My.Application.Info.Title liefert den Titel des Projektes (hier VB_Hotkeys). Ihr könnt auch einen festen Namen mit "Mein Programmname" festlegen
    237. ' CHR(34) ist das interne Zeichen für die Anführungsstriche ". Das hinzufügen der Anführungsstriche sorgt dann für den Eintrag "<Pfad der EXE-Datei>" in der Registry
    238. RegKey.SetValue(My.Application.Info.Title, Chr(34) & System.Reflection.Assembly.GetEntryAssembly.Location & Chr(34))
    239. Catch ex As Exception
    240. MsgBox("Autostart ist bereits aktiviert!", MsgBoxStyle.Information, "Info")
    241. End Try
    242. Else
    243. Try
    244. ' Entfernt den Pfad auf die EXE-Datei. Somit wird das Programm beim nächsten Rechnerstart nicht mehr geöffnet.
    245. RegKey.DeleteValue(My.Application.Info.Title)
    246. Catch ex As Exception
    247. MsgBox("Autostart ist bereits deaktiviert!", MsgBoxStyle.Information, "Info")
    248. End Try
    249. End If
    250. ' Einstellungen sichern
    251. Call Checkboxen_sichern()
    252. End Sub
    253. Private Sub Btn_Minimieren_Click(sender As Object, e As EventArgs) Handles Btn_Minimieren.Click
    254. ' Die aktuellen Einstellungen sichern
    255. Call Checkboxen_sichern()
    256. ' Die Auswahl - Form wird ausgeblendet
    257. Me.Hide()
    258. ' Das Programm wird nicht in der Taskleiste angezeigt
    259. ShowInTaskbar = False
    260. End Sub
    261. Private Sub Btn_Programm_beenden_Click(sender As Object, e As EventArgs) Handles Btn_Programm_beenden.Click
    262. ' Hier wird das Programm beendet
    263. ' Die aktuellen Einstellungen sichern
    264. Call Checkboxen_sichern()
    265. ' Zuerst wird die Form minimiert
    266. Me.Hide()
    267. ' Dann der Hinweistext angezeigt für x Sekunden
    268. If My.Settings.Hinweistext_Anzeigen = True Then
    269. NotifyIcon1.ShowBalloonTip(My.Settings.Hinweistext_Anzeigen_Sekunden * 1000, "VB Hotkeys", "Volker Bunge's Hotkeyprogramm wird beendet", ToolTipIcon.Info)
    270. End If
    271. ' Dann wird noch 1 Sekunden gewartet
    272. Warten.WaitOne(My.Settings.Hinweistext_Anzeigen_Sekunden * 1000) 'to get it into milliseconds
    273. ' Das Icon ausgeblendet
    274. NotifyIcon1.Visible = False
    275. NotifyIcon1.Dispose()
    276. ' und das Programm beendet
    277. End
    278. End Sub
    279. #End Region
    280. End Class


    Hier gibt es auch ein passendes Erklärvideo von mir dazu. Die Icons sind auch noch im Anhang unten angefügt.



    Viel Spass

    Volker

    *Korrekten Code-Tag eingefügt*
    Dateien
    • ICO-Dateien.zip

      (11,71 kB, 39 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo zusammen,

    ich habe mein Hotkey-Programm optisch ein wenig überarbeitet und dabei leider festgestellt, dass das STRG+X zwar bei Texten funktioniert, aber nicht bei anderen Dingen wie Dateien und bspw. Grafiken in Word.

    Es geht um den zweiten Codeblock und dort um die Zeilen 167 - 178. Ich habe zwar gerade noch die Hotkey-Taste geändert, aber das Aufrufen dieser Zeilen funktioniert soweit erst einmal.

    Ob ich jetzt mit Sendkeys ober mit Keyb arbeite ändert leider am Ergebnis nichts.

    Könnte mir einer von Euch hier einen Grund bzw. natürlich eine Lösung nennen?

    Vielen Dank und noch allen ein schönes Wochenende.

    Gruß

    Volker
    Funktioniert es, wenn Du Dein Programm mit admin-Rechten startest?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo zusammen,

    sorry, dass ich mich erst jetzt melde, aber mir ist leider immer wieder was dazwischen gekommen.

    @VaporiZed: Leider nein. Selbst wenn ich es von meinem Netzlaufwerk auf C kopiere und von dort aus starte.

    Habe hier dann aber noch eine andere Frage: Gibt es eine Möglichkeit, die Linke und Rechte Shift bzw. STRG-Taste abzufragen und auf diese zu reagieren?

    Wäre hier mal auf kleine Hinweise angewiesen.

    Schönen Sonntag noch.

    Gruß

    Volker
    Moinsen.

    Ja. Eine Unterscheidung der linken und rechten Tasten ist gegeben.

    Schaue einmal in die KeyCodes Tabelle von Microsoft.

    z.B.:
    VK_LWIN - 0x5B - Left Windows key (Natural keyboard)
    VK_RWIN - 0x5C - Right Windows key (Natural keyboard)

    VK_LSHIFT - 0xA0 - Left SHIFT key
    VK_RSHIFT - 0xA1 - Right SHIFT key

    VK_LCONTROL - 0xA2 - Left CONTROL key
    VK_RCONTROL - 0xA3 - Right CONTROL key

    VK_LMENU - 0xA4 - Left ALT key
    VK_RMENU - 0xA5 - Right ALT key

    Quelle: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

    c.u. Joshi aus HaHa