Puede que te maree, pero siempre que conozcas el conocimiento de VB y quieras esto, debes estudiarlo detenidamente.
modHook.bas
Opción explícita
Función de declaración pública CallNextHookEx Lib user32.dll (ByVal hHook mientras, ByVal nCode mientras, ByVal wParam mientras, lparam como cualquiera) Mientras
Declaración pública Sub CopyMemory Lib kernel32 Alias RtlMoveMemory (lpDest como cualquiera, lpSource como cualquiera, ByVal cBytes como largo)
Declaración pública Sub keybd_event Lib user32 (ByVal bVk como byte, ByVal bScan como byte, ByVal dwFlags mientras, ByVal dwExtraInfo mientras)
Datos públicos() como cadena
NUM público siempre y cuando
público oldhook siempre y cuando
Público LngClsPtr mientras
BackHook de función pública (ByVal nCode mientras, ByVal wParam mientras, ByVal lparam mientras) Mientras
Si nCode < 0 entonces
BackHook = CallNextHookEx(OldHook, nCode, wParam, lparam)
Función de salida
Terminar si
ResolvePointer(LngClsPtr).RiseEvent (lparam)
Llamar a CallNextHookEx(OldHook, nCode, wParam, lparam)
Función final
Función privada ResolvePointer (ByVal lpObj mientras) como ClsHook
Atenuar la SST como ClsHook
CopiarMemoria oSH, lpObj, 4&
Establecer ResolvePointer = oSH
CopiarMemoria oSH, 0&, 4&
Función final
ClsHook.cls
Opción explícita
Evento público KeyDown (código clave como número entero, cambio como número entero)
Tipo privado EVENTMSG
wMsg siempre y cuando
lParamLow siempre y cuando
lParamHigh siempre y cuando
msgTiempo Mientras
hWndMsg siempre y cuando
Tipo de extremo
Constante privada WH_JOURNALRECORD = 0
Const privada WM_KEYDOWN = &H100
Función de declaración privada SetWindowsHookEx Lib user32.dll Alias SetWindowsHookExA (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Función de declaración privada UnhookWindowsHookEx Lib user32.dll (ByVal hHook As Long) As Long
Función de declaración privada GetAsyncKeyState Lib user32.dll (ByVal vKey siempre) como entero
Subconjunto públicoHook()
OldHook = SetWindowsHookEx(WH_JOURNALRECORD, Dirección de BackHook, App.hInstance, 0)
Subtítulo final
Subdescolgar público()
Llamar a UnhookWindowsHookEx(OldHook)
Subtítulo final
Función amiga RiseEvent(ByVal lparam As Long) As Long
Atenuar mensaje como EVENTMSG
Dim IntShift como número entero
Dim IntCode como número entero
CopyMemory Msg, ByVal lparam, Len(Msg)
Cambio Int = 0
Seleccionar mensaje de caso.wMsg
Caso WM_KEYDOWN
Si GetAsyncKeyState(vbKeyShift) Entonces IntShift = (IntShift o 1)
Si GetAsyncKeyState(vbKeyControl) Entonces IntShift = (IntShift o 2)
Si GetAsyncKeyState(vbKeyMenu) Entonces IntShift = (IntShift o 4)
IntCode = Msg.lParamLow y &HFF
Depurar.Imprimir Msg.lParamLow
Depurar.Imprimir &HFF
RaiseEvent KeyDown (IntCode, IntShift)
Finalizar selección
Función final
Subclase privada_Initialize()
LngClsPtr = ObjPtr(Yo)
Subtítulo final
formulario1.frm
Opción explícita
Atenuar con gancho de eventos como ClsHook
Función de declaración privada MapVirtualKeyEx Lib user32 Alias MapVirtualKeyExA (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long) As Long
Función de declaración privada GetKeyboardLayout Lib user32 (ByVal dwLayout As Long) As Long
Función de declaración privada GetForegroundWindow Lib user32 () siempre y cuando
Función de declaración privada GetWindowThreadProcessId Lib user32 (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Sub Hook_KeyDown privado (código clave como número entero, cambio como número entero)
DimStrCodeAsString
StrCode = CodeToString (Código clave)
Si StrCode = [Shift] O StrCode = [Alt] O StrCode = [Ctrl] Entonces
Si Shift = vbAltMask + vbCtrlMask Entonces StrCode = [Alt + Ctrl]
Si Shift = vbAltMask + vbShiftMask Entonces StrCode = [Alt + Shift]
Si Mayús = vbCtrlMask + vbShiftMask Entonces StrCode = [Ctrl + Mayús]
Si Shift = vbCtrlMask + vbShiftMask + vbAltMask Entonces StrCode = [Ctrl + Shift +Alt]
Demás
Si Shift = vbShiftMask Entonces StrCode = [Shift] + & StrCode
Si Shift = vbCtrlMask Entonces StrCode = [Ctrl] + & StrCode
Si Shift = vbAltMask Entonces StrCode = [Alt] + & StrCode
Si Shift = vbAltMask + vbCtrlMask Entonces StrCode = [Alt + Ctrl] + & StrCode
Si Shift = vbAltMask + vbShiftMask Entonces StrCode = [Alt + Shift] + & StrCode
Si Shift = vbCtrlMask + vbShiftMask Entonces StrCode = [Ctrl + Shift] + & StrCode
Si Shift = vbCtrlMask + vbShiftMask + vbAltMask Entonces StrCode = [Ctrl + Shift +Alt] + & StrCode
Terminar si
If LCase(StrCode) = LCase(HotKey) Then ' Esta sección es una función simple después del GANCHO del teclado, que sirve para ocultar y mostrar la ventana desde.
Si App.TaskVisible = False entonces
Yo.Mostrar
App.TaskVisible = Verdadero
Demás
Yo.Ocultar
App.TaskVisible = Falso
Terminar si
Terminar si
Subtítulo final
Función privada CodeToString (nCode como entero) como cadena
DimStrKeyAsString
Seleccione Caso nCode
Caso vbKeyBack: StrKey = Retroceso
Caso vbKeyTab: StrKey = Tabulador
Caso vbKeyClear: StrKey = Borrar
Caso vbKeyReturn: StrKey = Enter
Caso vbKeyShift: StrKey = Mayús
Caso vbKeyControl: StrKey = Ctrl
Caso vbKeyMenu: StrKey = Alt
Caso vbKeyPause: StrKey = Pausa
Caso vbKeyCapital: StrKey = Bloq Mayús
Caso vbKeyEscape: StrKey = ESC
Caso vbKeySpace: StrKey = BARRA ESPACIADORA
Caso vbKeyPageUp: StrKey = RE PÁG
Caso vbKeyPageDown: StrKey = PÁGINA ABAJO
Caso vbKeyEnd: StrKey = FIN
Caso vbKeyHome: StrKey = INICIO
Caso vbKeyLeft: StrKey = FLECHA IZQUIERDA
Caso vbKeyUp: StrKey = FLECHA ARRIBA
Caso vbKeyRight: StrKey = FLECHA DERECHA
Caso vbKeyDown: StrKey = FLECHA ABAJO
Caso vbKeySelect: StrKey = SELECCIONAR
Caso vbKeyPrint: StrKey = IMPRIMIR PANTALLA
Caso vbKeyExecute: StrKey = EJECUTAR
Caso vbKeySnapshot: StrKey = INSTANTÁNEA
Caso vbKeyInsert: StrKey = INS
Caso vbKeyDelete: StrKey = SUPR
Caso vbKeyHelp: StrKey = AYUDA
Caso vbKeyNumlock: StrKey = BLOQ NUM
Caso vbKey0 a vbKey9: StrKey = Chr$(nCode)
Caso vbKeyA a vbKeyZ: StrKey = LCase(Chr$(nCode)) 'MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))))
Caso vbKeyF1 a vbKeyF16: StrKey = F & CStr(nCode - 111)
Caso vbKeyNumpad0 a vbKeyNumpad9: StrKey = teclado numérico y CStr(nCode - 96)
Caso vbKeyMultiply: StrKey = teclado numérico {*}
Caso vbKeyAdd: StrKey = teclado numérico {+}
Caso vbKeySeparator: StrKey = teclado numérico {ENTER}
Caso vbKeySubtract: StrKey = teclado numérico {-}
Caso vbKeyDecimal: StrKey = teclado numérico {.}
Caso vbKeyDivide: StrKey = teclado numérico {/}
Caso más
StrKey = Chr$(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0)))) & Str(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))))
Finalizar selección
CodeToString = [ & StrKey & ]
Función final