Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
OnKey im Userform
zurück: Dateioperationen mit der SHFileOperation-Funktion weiter: Userform am Mauszeiger anzeigen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Information Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Isabelle :-)
Menschin


Verfasst am:
21. Okt 2013, 17:25
Rufname:
Wohnort: Westlicher Spiralarm der Galaxis


OnKey im Userform - OnKey im Userform

Nach oben
       Version: Office 2k (2000)

Hallöchen,

das funktioniert ja normalerweise nicht, da die Methode nur in Tabellen arbeitet. Mit ein wenig API-Zauber geht das aber auch in einem Userform ohne für jedes Control ein KeyDown – Event zu schreiben oder extra dafür eine Klasse zu instanziieren.

Dazu ein kleines Beispiel. Im Modul des Userforms:

Code:
Option Explicit

Private Declare Sub Sleep Lib "kernel32.dll" ( _
    ByVal dwMilliseconds As Long)
Private Declare Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function RegisterHotKey Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal id As Long, _
    ByVal fsModifiers As Long, _
    ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal id As Long) As Long
Private Declare Function PeekMessageA Lib "user32.dll" ( _
    ByRef lpMsg As MESSAGE, _
    ByVal hWnd As Long, _
    ByVal wMsgFilterMin As Long, _
    ByVal wMsgFilterMax As Long, _
    ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32.dll" () As Long

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MESSAGE
    hWnd As Long
    lMessage As Long
    wParam As Long
    lParam As Long
    ltime As Long
    pt As POINTAPI
End Type

Private Const MOD_ALT As Long = &H1
Private Const MOD_CONTROL As Long = &H2
Private Const MOD_SHIFT As Long = &H4
Private Const MOD_WIN As Long = &H8

Private Const PM_NOREMOVE = &H0
Private Const PM_REMOVE = &H1
Private Const PM_NOYIELD = &H2

Private Const WM_HOTKEY As Long = &H312

Private Const HOTKEY_ID1 As Long = &HBFFF
Private Const HOTKEY_ID2 As Long = &HBFFE
Private Const HOTKEY_ID3 As Long = &HBFFD
Private Const HOTKEY_ID4 As Long = &HBFFC
Private Const HOTKEY_ID5 As Long = &HBFFB
Private Const HOTKEY_ID6 As Long = &HBFFA
Private Const HOTKEY_ID7 As Long = &HBFF9

Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"

Private mblnCancel As Boolean
Private mlngHwnd As Long

Private Sub UserForm_Activate()

    'Zugriffsnummer des Userforms ermitteln
    mlngHwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)

    'Tastenkombinationen erzeugen
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID1, MOD_CONTROL, vbKeyA)                          'CTRL + A
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID2, MOD_ALT, vbKeyB)                              'ALT + B
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID3, MOD_SHIFT, vbKeyC)                            'SHIFT + C
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID4, MOD_CONTROL Or MOD_ALT, vbKeyD)               'CTRL + ALT + D
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID5, MOD_CONTROL Or MOD_SHIFT, vbKeyE)             'CTRL + SHIFT + E
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID6, MOD_ALT Or MOD_SHIFT, vbKeyF)                 'ALT + SHIFT + F
    Call RegisterHotKey(mlngHwnd, HOTKEY_ID7, MOD_CONTROL Or MOD_ALT Or MOD_SHIFT, vbKeyG)  'CTRL + ALT + SHIFT + G

    'Schleife zum Abfangen der Tastenkombinationen
    Call WaitForMessages

End Sub

Private Sub UserForm_Terminate()

    'Flag zum Abbrechen der Schleife setzte
    mblnCancel = True

    'Tastenkombinationen löschen
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID1)
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID2)
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID3)
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID4)
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID5)
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID6)
    Call UnregisterHotKey(mlngHwnd, HOTKEY_ID7)

End Sub

Private Sub WaitForMessages()

    Dim udtMessage As MESSAGE

    'Schleife in der die Tastenkombinationen abgefangen werden
    Do Until mblnCancel

        'Warten bis eine neue Nachricht platziert wird
        Call WaitMessage

        'Nachricht abrufen
        If PeekMessageA(udtMessage, mlngHwnd, WM_HOTKEY, _
            WM_HOTKEY, PM_REMOVE) Then

            'Auswerten der Nachricht
            Select Case udtMessage.wParam
                Case HOTKEY_ID1: Call MsgBox("HOTKEY A pressed")
                Case HOTKEY_ID2: Call MsgBox("HOTKEY B pressed")
                Case HOTKEY_ID3: Call MsgBox("HOTKEY C pressed")
                Case HOTKEY_ID4: Call MsgBox("HOTKEY D pressed")
                Case HOTKEY_ID5: Call MsgBox("HOTKEY E pressed")
                Case HOTKEY_ID6: Call MsgBox("HOTKEY F pressed")
                Case HOTKEY_ID7: Call MsgBox("HOTKEY G pressed")
            End Select
        End If

        DoEvents

        'Kleine Pause von 100 Millisekunden
        Call Sleep(100)

    Loop
End Sub

Wenn du aus dem Userform heraus eine etwas größere Routine startest, dann am Anfang der Routine das Flag "mblnCancel" auf True setzten, am Ende der Routine wieder auf False und die Routine "WaitForMessages" wieder starten. Beispiel:

Code:
Private Sub CommandButton1_Click()
    mblnCancel = True
    Call GroessereRoutine
    mblnCancel = False
    Call WaitForMessages
End Sub

_________________
LG Isi

Die Mitgliedschaft im Forum erhöht deine Chance auf eine Antwort von mir um 99,999%
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Formeln: In Tabelle Zelle anklicken trotz Userform oder MsgBox 3 Schokoscherzkeks 232 05. Apr 2014, 16:06
slowboarder In Tabelle Zelle anklicken trotz Userform oder MsgBox
Keine neuen Beiträge Excel Formeln: Über Userform Zellen/Spalten füllen! 0 Sarra 87 11. März 2013, 17:04
Sarra Über Userform Zellen/Spalten füllen!
Keine neuen Beiträge Excel Formeln: Werte aus userform auslesen 1 Bergi591980 1539 10. Jan 2010, 06:35
anubis2k5 Werte aus userform auslesen
Keine neuen Beiträge Excel Formate: Zeiteneingabe in Userform 4 js255 483 22. Nov 2009, 20:29
js255 Zeiteneingabe in Userform
Keine neuen Beiträge Excel Formeln: Userform Werte an Tabelle übergeben 1 WUT4 1618 12. Mai 2009, 18:26
etron795 Userform Werte an Tabelle übergeben
Keine neuen Beiträge Excel VBA (Makros): UserForm öffnen nur wenn Text in Textbox 4 Norbert_B 813 04. März 2005, 21:01
Norbert_B UserForm öffnen nur wenn Text in Textbox
Keine neuen Beiträge Excel VBA (Makros): Userform / Defaultwerte einstellen 2 Hopi 1409 15. Feb 2005, 10:50
Hopi Userform / Defaultwerte einstellen
Keine neuen Beiträge Excel VBA (Makros): Daten aus Tabelle in UserForm einlesen und ändern 2 mibruns 1831 09. Feb 2005, 10:40
mibruns Daten aus Tabelle in UserForm einlesen und ändern
Keine neuen Beiträge Excel VBA (Makros): UserForm mit Bild versehen 2 gilmax 517 28. Jan 2005, 15:55
gilmax UserForm mit Bild versehen
Keine neuen Beiträge Excel Formeln: Userform 2 TonisPizza 826 10. Dez 2004, 14:34
TonisPizza Userform
Keine neuen Beiträge Excel VBA (Makros): Rechteck bei übergabe aus UserForm 2 sreuber 603 30. Nov 2004, 08:00
sreuber Rechteck bei übergabe aus UserForm
Keine neuen Beiträge Excel VBA (Makros): Bei Click auf eine Zelle öffnen einer userform 1 crstar77 1003 19. Nov 2004, 17:09
Kuwe Bei Click auf eine Zelle öffnen einer userform
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Project