Hej Frank
Det du skal, er at "hokke" keyboardet.
Det gøres ved at oprette en såkald "callback" procedure som Windows
efterfølgende kalder, hver gang der bliver rørt ved keyboardet. Du skal dog
være opmærksom på, at dette vil gælde for ALLE applikationer der kører...
ikke kun dit program.
Dette kan du dog tage højde for, ved at tjekke om din applikation er aktiv
eller ej.
I et modul skal du ligge følgende API med tilhørede callback procedure:
*******************************************************
Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Public Declare Function PostMessage Lib "user32" _
Alias "PostMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Const WH_KEYBOARD = 2
Public Const KBH_MASK = &H20000000
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public hHook As Long
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
If nCode >= 0 Then
If wParam = Asc("C") Then
'gør et eller andet
KeyboardProc = 1
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
*******************************************************
I en form (eller f.eks Sub Main) skal du indsætte følgende:
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, _
AddressOf KeyboardProc, _
0&, _
App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub
*******************************************************
HUSK: Når du arbejder med API-kald der "hooker" eller "subclasser" så sørg
for altid at lukke dit program på "normal" vis... det vil sige ikke noget
med bruge stop-knappen på VB værktøjslinje... husk også ALTID at "un-hooke"
igen...
Jeg vedlægger hér mere om callback proceduren... (Det er taget fra MSDN)
KeyboardProc
The KeyboardProc hook procedure is an application-defined or library-defined
callback function used with the SetWindowsHookEx function. The system calls
this function whenever an application calls theGetMessage orPeekMessage
function and there is a keyboard message (WM_KEYUP orWM_KEYDOWN) to be
processed.
The HOOKPROC type defines a pointer to this callback function. KeyboardProc
is a placeholder for the application-defined or library-defined function
name.
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);
Parameters
code
Specifies a code the hook procedure uses to determine how to process the
message. This parameter can be one of the following values: Value Meaning
HC_ACTION The wParam and lParam parameters contain information about
a keystroke message.
HC_NOREMOVE The wParam and lParam parameters contain information
about a keystroke message, and the keystroke message has not been removed
from the message queue. (An application called the PeekMessage function,
specifying the PM_NOREMOVE flag.)
If code is less than zero, the hook procedure must pass the message to the
CallNextHookEx function without further processing and should return the
value returned by CallNextHookEx.
wParam
Specifies the virtual-key code of the key that generated the keystroke
message.
lParam
Specifies the repeat count, scan code, extended-key flag, context code,
previous key-state flag, and transition-state flag. This parameter can be a
combination of the following values: Value Description
0-15 Specifies the repeat count. The value is the number of times
the keystroke is repeated as a result of the user's holding down the key.
16-23 Specifies the scan code. The value depends on the original
equipment manufacturer (OEM).
24 Specifies whether the key is an extended key, such as a function
key or a key on the numeric keypad. The value is 1 if the key is an extended
key; otherwise, it is 0.
25-28 Reserved.
29 Specifies the context code. The value is 1 if the alt key is
down; otherwise, it is 0.
30 Specifies the previous key state. The value is 1 if the key is
down before the message is sent; it is 0 if the key is up.
31 Specifies the transition state. The value is 0 if the key is
being pressed and 1 if it is being released.
For more information about the lParam parameter, seeKeystroke Message Flags.
Return Values
If nCode is less than zero, the hook procedure must return the value
returned by CallNextHookEx.
If nCode is greater than or equal to zero, and the hook procedure did not
process the message, it is highly recommended that you call CallNextHookEx
and return the value it returns; otherwise, other applications that have
installed WH_KEYBOARD hooks will not receive hook notifications and may
behave incorrectly as a result. If the hook procedure processed the message,
it may return a nonzero value to prevent the system from passing the message
to the rest of the hook chain or the target window procedure.
Remarks
An application installs the hook procedure by specifying the WH_KEYBOARD
hook type and the address of the hook procedure in a call to the
SetWindowsHookEx function.
QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Unsupported.
Header: Declared in winuser.h.
Import Library: User-defined.
See Also
Hooks Overview, Hook Functions, CallNextHookEx,GetMessage,PeekMessage,
SetWindowsHookEx,WM_KEYUP,WM_KEYDOWN
/Carsten Suurland
|