Hi,
zu 1 kann ich so adHoc nix sagen,
zum zweiten Teil Deiner Frage:
Wenn das Programm diesen Tastendruck nicht unbedingt mitbekommen muss geht es so :
Code für ein Modul
Option Explicit
' RegisterHotKey API
Public Enum RegisterHotKeyModifiers
MOD_ALT = &H1
MOD_CONTROL = &H2
MOD_SHIFT = &H4
End Enum
Public Declare Function RegisterHotKey Lib "user32" _
(ByVal hWnd As Long, _
ByVal id As Long, _
ByVal fsModifiers As RegisterHotKeyModifiers, _
ByVal vk As KeyCodeConstants) As Long
Public Declare Function UnregisterHotKey Lib "user32" _
(ByVal hWnd As Long, _
ByVal id As Long) As Long
Public Declare Function GlobalAddAtom Lib "kernel32" _
Alias "GlobalAddAtomA" _
(ByVal lpString As String) As Long
Public Declare Function GlobalDeleteAtom Lib "kernel32" _
(ByVal nAtom As Long) As Long
' WindowProc API
Private Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_HOTKEY As Long = &H312
Private lpPrevWndProc As Long
Private oForm As Form
Public Sub Hook(ByVal oMainForm As Form)
If lpPrevWndProc = 0 Then
' WindowProc verbiegen
Set oForm = oMainForm
lpPrevWndProc = SetWindowLong(oForm.hWnd, GWL_WNDPROC, AddressOf WindowProc)
Else
MsgBox "Jeder nur ein Kreuz!"
End If
End Sub
Public Sub Unhook()
On Error Resume Next
If lpPrevWndProc = 0 Then
' ursprüngliche WindowProc wiederherstellen
Call SetWindowLong(oForm.hWnd, GWL_WNDPROC, lpPrevWndProc)
Set oForm = Nothing
End If
End Sub
Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
' NIEMALS HIER VERSUCHEN ZU DEBUGGEN!
Select Case hWnd
Case oForm.hWnd
If uMsg = WM_HOTKEY Then
'Aha ein Hotkey
Call oForm.HotKeyPressed(wParam)
End If
Case Else
End Select
' Massage durch den urprünglichen WindowHandler verarbeiten lassen
WindowProc = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, lParam)
End Function Versuch aber bitte nicht die Funktion WindowProc irgendwie zu debuggen! Dann fliegt Dir die IDE um die Ohren!!!
Code für Dein Hauptform
Option Explicit
Private lAtomID1 As Long
Private lAtomID2 As Long
Private Sub Form_Load()
lAtomID1 = GlobalAddAtom(CStr(Now) & "A")
lAtomID2 = GlobalAddAtom(CStr(Now) & "B")
Call Hook(Me)
Debug.Print RegisterHotKey(Me.hWnd, lAtomID1, MOD_CONTROL + MOD_ALT, vbKeyT)
Debug.Print RegisterHotKey(Me.hWnd, lAtomID2, MOD_ALT, vbKeyU)
End Sub
Private Sub Form_Unload(Cancel As Integer)
' Hotkey entfernen
Debug.Print UnregisterHotKey(Me.hWnd, lAtomID1)
' WICHTIG!!!!
' Das UnHook kann nur weggelassen werden, wenn beim starten auch kein Hook
' ausgeführt wurde.
Call Unhook
End Sub
Public Function HotKeyPressed(lID As Long)
Debug.Print lID
Me.SetFocus
Select Case lID
Case lAtomID1
' Hotkey 1
MsgBox "STRG + ALT + T"
Case lAtomID2
' Hotkey 2
MsgBox "ALT + U"
End Select
End Function Gruß
Tolwyn
PS: Es können 'beliebig' viele HotKeys registriert werden. |