En un form mete esté código:
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Sub Command1_Click()
SetTimer Me.hwnd, 0, 1, AddressOf Go
End Sub
Private Sub Command2_Click()
KillTimer Me.hwnd, 0
End Sub
Con dos CommandButton, uno para parar el timer y el otro para crearlo.
y en un módulo esto:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Dim Tecla$, TeclaVieja$
Sub Go(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Tecla = ObtenerTecla
If Tecla <> TeclaVieja Then
TeclaVieja = Tecla
MsgBox "Tecla " & TeclaVieja & " fue pulsada."
End If
End Sub
Private Function ObtenerTecla() As String
If GetAsyncKeyState(76) Then
ObtenerTecla = Chr$(76)
End If
End Function
El getasynckeystate funciona para todo el sistema sin importar en que ventana estes activo, el SetTimer corre un timer de 1 milisegundo ejecutando las ordenes que se encuentran dentro del sub go.
Creo que es estó a lo que te referis.
Saludos!