RegisterHotKey mit Alt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    RegisterHotKey mit Alt

    Hallo ihr lieben,

    ich habe ein Problem wenn ich eine Hotkey kombination mit Alt registrieren möchte. Diese wirft immer einen Fehler.

    Ich habe den Code von Stackoverflow und versteh nicht ganz das Problem.

    Es gibt 2 Constanten:

    VB.NET-Quellcode

    1. Private Const USE_ALT As Integer = 1
    2. Private Const USE_CTRL As Integer = 2


    DLL-Import:

    VB.NET-Quellcode

    1. <DllImport("user32.dll")>
    2. Private Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
    3. End Function


    Register:

    VB.NET-Quellcode

    1. Private Sub RegisterGlobalHotKey(ByVal hotkey As Keys, ByVal modifiers As Integer)
    2. Try
    3. mHotKeyId += 1
    4. If mHotKeyId > 0 Then
    5. If RegisterHotKey(Me.Handle, mHotKeyId, modifiers, Convert.ToInt16(hotkey)) = 0 Then
    6. MessageBox.Show("Error: " & mHotKeyId.ToString() & " - " + Marshal.GetLastWin32Error().ToString(), "Hot Key Registration")
    7. End If
    8. End If
    9. Catch
    10. UnregisterGlobalHotKey()
    11. End Try
    12. End Sub


    Aufruf:

    VB.NET-Quellcode

    1. RegisterGlobalHotKey(Keys.F4, USE_ALT)


    Immer wenn ich jetzt Probiere Use_alt zu benutzen kommt ein Fehler "Error 2 - 0". Kann mit einer sagen wieso?

    Strg funktioniert hingegen Problemlos:

    VB.NET-Quellcode

    1. RegisterGlobalHotKey(Keys.V, USE_CTRL)


    Danke =)
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    @C.O.D.E Warum in die Ferne schweifen? Systemweiten Hotkey registrieren (kein Tastatur Hook)
    Ich hab das mal mit allen Modifiers probiert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function RegisterHotKey Lib "user32" ( _
    3. ByVal Hwnd As IntPtr, ByVal ID As Integer, _
    4. ByVal Modifiers As Integer, ByVal Key As Integer) As Integer
    5. Private Declare Function UnregisterHotKey Lib "user32" ( _
    6. ByVal Hwnd As IntPtr, ByVal ID As Integer) As Integer
    7. Private Const Key_None As Integer = &H0
    8. Private Const Key_Alt As Integer = &H1
    9. Private Const Key_Ctrl As Integer = &H2
    10. Private Const Key_Shift As Integer = &H4
    11. Private Const Key_Win As Integer = &H8
    12. Private Const WM_HOTKEY As Integer = &H312
    13. Protected Overrides Sub WndProc(ByRef m As Message)
    14. If m.Msg = WM_HOTKEY Then
    15. Select Case CInt(m.WParam)
    16. Case 1 : Label1.Text = "A"
    17. Case 2 : Label1.Text = "Alt + B"
    18. Case 3 : Label1.Text = "Shift + Ctrl + C"
    19. Case 4 : Label1.Text = "Shift + Ctrl + Alt + Win + Q"
    20. End Select
    21. End If
    22. MyBase.WndProc(m)
    23. End Sub
    24. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    25. RegisterHotKey(Me.Handle, 1, Key_None, Keys.A)
    26. RegisterHotKey(Me.Handle, 2, Key_Alt, Keys.B)
    27. RegisterHotKey(Me.Handle, 3, Key_Shift Or Key_Ctrl, Keys.C)
    28. RegisterHotKey(Me.Handle, 4, Key_Shift Or Key_Ctrl Or Key_Alt Or Key_Win, Keys.Q)
    29. End Sub
    30. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    31. UnregisterHotKey(Me.Handle, 1)
    32. UnregisterHotKey(Me.Handle, 2)
    33. UnregisterHotKey(Me.Handle, 3)
    34. UnregisterHotKey(Me.Handle, 4)
    35. End Sub
    36. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @'RodFromGermany Der code funktioniert natürlich wieder wie gewohnt Top. Die Frage ist, warum hat der Code einen Fehler oder wo ist der Fehler?
    Danke für den Code, ich werde versuchen daraus zu lernen!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    @C.O.D.E Wie äußert sich der Fehler, bei welcher Zeile im Code tritt er auf?
    Poste mal so viel Code, dass wir den Effekt reproduzieren können.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dein Code funktioniert an sich bei mit, C.O.D.E. Aber die Hotkey-Zuweisung für Alt+F4 geht auch bei mir nicht. Spekulatius: Alt+F4 ist eine Kombi, die Du nicht überschreiben kannst/darfst.
    siehe stackoverflow, MSDN
    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.
    @VaporiZed Nicht ganz.
    @C.O.D.E' Auf einem Win7-32 und auf einem Win7-64 funktioniert das Überschreiben von Alt-F4.
    Bei Win10-64 passiert nichts, Alt-F4 beendet das Programm, wie es sich gehört.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist schade, ich bin nämlich gerade dabei mein DeskSave von 2011 komplett neu zu machen. Dort war das Maximum noch Windows Vista und hat ohne Probleme funktioniert.
    -> DeskSave - Testphase

    Somit ist das Projekt unbrauchbar wenn man es mit Alt + F4 beenden kann.

    Danke für eure mühe!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    @C.O.D.E Wenn das Hauptprogramm eine Form ist, kannst Du doch die Beendigung durch Alt+F4 im FormClosing-Event abfangen, sieh Dir mal die Property e.ClosingReason an.
    Und mach Dir ein Flag, dass Du das Programm per Button beenden kannst, sonnst kommst Du da nicht raus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @'RodFromGermany

    Du hattest recht, jetzt fehlt es mir nur noch Alt + Tab zu sperren was aktuell nicht Funktioniert. (Irgendwie alles mit Alt funktioniert nicht)

    Hier der Funktionierende Code um Alt + F4 zu umgehen.

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    2. If (e.CloseReason = CloseReason.UserClosing) Then
    3. e.Cancel = True
    4. MessageBox.Show("Nicht erlaubte Handlung", "Achtung", MessageBoxButtons.OK, MessageBoxIcon.Error)
    5. End If
    6. End Sub


    Danke
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    C.O.D.E schrieb:

    Alt + Tab zu sperren
    Willst Du andere Programme mobben :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich so ne Desktop-Sperre baue wäre ja doof wenn ich dann einfach das Programm runter klappen kann mit Alt+Tab -> Ja dann Mobbe ich sie! :D

    Ich werde da später mal was ausprobieren. Editiere dann diesen Post!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    C.O.D.E schrieb:

    Desktop-Sperre
    Du kannst Dich doch einfach ausloggen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @C.O.D.E Ich habs noch nicht probiert, aber es gibt die Möglichkeit, einen weiteren Desktop anzulegen.
    Such mal in diese Richtung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oh wow, das ist ne sehr Interessante richtung. Ich werde mich da mal schlau machen.

    Danke (y)

    *Vollzitat entfernt* ~NoFear23m
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

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

    @C.O.D.E bitte lass das mit den Vollzitaten. Überhaupt - wenn du direkt auf einen Thread Antwortest welcher so kurz ist, ist eine Zitierung ja auch unnötig.

    Weiters werde ich diesen thread ab sofort beobachten. Denn alles mit
    ALT in Verbindung mit F4 und dann auch noch ALT+TAB zu unterbinden riecht streng nach etwas bösen.
    Und für solch etwas bekommst du hier keinen Input bzw. werde ich dies unterbinden.


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich finde dieses grundlegende Kriminalisieren meinerseits echt nicht schön.

    Wie ich im Post #7 mein altes DeskSave verlinkt habe, mache ich es hier auch: DeskSave - Testphase
    Ständig sehe ich das immer etwas böses vermutet wird wo in 99% der fällen nicht mal eine grundlage für ist.

    Bsp: VB.NET Anwendung immer im Vordergrund
    Ich kann genau verstehen was er meint. Ich komme ehemals aus dem Handwerk wo wir mit CNC's Arbeiten. Das was er gefordert hat ist absolut typisch.

    Wie soll man so eine Desktop-Sperre deiner Super-Moderaten-Meinung sonst anstellen? Man muss in diesem fall ja dafür sorgen das man das Programm nicht einfach beenden kann.

    Ich frage mich ernsthaft warum ich für dieses Forum spende wenn man bei jeder kleinigkeit angekackt wird. Das mit dem Vollzitat, Okay, verstehe ich - aber ich lasse mir NICHT unterstellen das ich hier etwas kriminelles vorhabe und ist deinerseits als Super-Moderator auch völlig unangebracht.

    In diesem Post steckt eine menge frust die ich mir hätte ersparen können, die du uns hättest ersparen können. Und wenn du jetzt meinst mir ne Verwarnung zugeben, dann mach es halt.

    Over and out
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „C.O.D.E“ ()

    Es gibt Regeln in diesem Forum. Diese sind auch verankert. Ich habe nichts unterstellt, ledeiglich geschrieben das ich es beobachte. Als Moderatoren müssen wir vom schlimmsten ausgehen und können nicht "hoffen" das hier keine Bösen absichten dahinterstecken, voralem weil es ja gar nicht darum geht ob DU nun Böse Absichten hast. Dir ist schon klar das in einem Forum im Internet das auch andere lesen können oder? Und wenn jemand von denen etwas Böses vorhat bekommt er hier dann schon alles Serviert. Denk mal bitte nach darüber. Ob du nun spendest oder nicht, eine Spende ist per definition freiwillig und du erkaufst dir damit auch keine Sonderprivilegien. Alleine deine Wortwahl sagt schon einiges aus und ich würde dich bitten, dich hier etwas zu zügeln und Sachlich zu bleiben, ich denke das können wir erwarten. Was als Moderator angebracht ist und was nicht entscheiden die Forenregeln. So, und an dieser Stelle machen wir auch schluss mit der Diskussion, wenn du unbedingt über das kleine Sätzchen zu Diskutieren anfangen willst kannst du das gerne auf anderem Wege tun.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Kleiner Nachtrag auf den ich vergessen habe einzugehen:

    Wie soll man so eine Desktop-Sperre deiner Super-Moderaten-Meinung sonst anstellen?

    Wenn man nicht auf den Desktop kommen können soll, gibt es denke ich die Möglichkeit den erst garnicht zu laden. Also wenn die explorer.exe erst gar nicht gestartet wird Beispielsweise.

    Es gibt da sicher einige Möglichkeiten. Ich hatte vor kurzen auch eine App geschrieben welche auf einer Maschine laufen soll bzw. eine Maschine steuern soll und da hatte ich sowieso Windows IOT in verwendung. Da gibt es erst gar keinen Desktop. Es gibt also viele Möglichkeiten. Schau dich vieleicht ein wenig in diese Richtung um, vieleicht Hilft dir das sogar noch besser weiter.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##