VB5.0»PWindows API ¶¡ªº©I¥s§Þ¥©                          CWW  87.02.24

    ¤@¯ë·|¨Ï¥ÎWINDOW APIªº±¡ªp¡A¹ê¦b¬O¦]¬°VB¥»¨­¤£´£¨Ñ¬Y¨Ç¥\¯à¡A¦ý¬O¡Aµ{¦¡©Ò
»Ý¤S¤£±o¤£µM¡A¨Ò¦p¡GŪ¨úRegistry¤ºªº¸ê®Æ¡AVB¥u´£¨ÑSaveSetting¡BGetsetting µ¥
¨t¦Cªº«ü¥O¡A¦ý¬O¥¦¥u¯àŪ¨ú¯S©w¦a°Ïªº­È¡A­nŪ¡B§R¡B§ó°Ê¨ä¥L°Ï°ìªº­È®É¡A´NµLªk
¨Ï¥Î¡C¦A¦p¡G¥J²Ó¬Ý¤@¬ÝCombo BoxªºEvents¡A¨ä¤¤¨S¦³MouseMove¡A¦ý³o¬O§Ú­Ì¸g±`¥Î
¤Wªº¤@­ÓEvent¡A¨º¸Ó¦p¦ó©O¡H¬Oªº¡A¨º¥u¦³³z¹LWinodow API¡C¦ÓVB©I¥sWindow API¤@
¯ë¤£³£¨Ï¥ÎAPIÀ˵ø­û¡Aª½±µ±N¬Û¹ïÀ³ªºAPI  COPY¨ì§Ú­Ìªºµ{¦¡¤¤´N¦n¡A¨ºÁ٥Τ°»ò§Þ
¥©¶Ü¡H¨ä¹ê¤£µM¡A¦]¬°VB¸ê®Æ®æ¦¡ªº°ÝÃD¡A¤S¥[¤WVB¥»¨­¨S¦³«ü¼Ð¡A¦b³\¦h¦a¤è»Ý­n¤@
¨Ç¤p§Þ¥©¤~¯à¸Ñ¨M¡A¦Ó¥B§Ú­Ì¸g±`¦]À³¤£¦Pªº»Ý¨D¡A±NAPI À˵ø­ûªº«Å§iCOPY¹L¨Ó«á¦A
°µ¤@¨Ç­×§ï¡A³Ì­«­nªº¡A¦pªG¦³¤@­Ó.DLLÀÉ¡A¥¦¤£¦bAPI À˵ø­û¤¤©w¸q¡A¨º®É¡A´N¥u¦³
¦Û¤v·Q¿ìªk°Õ¡C

¤@¡B ¾ã¼Æ°Ñ¼Æ

Windows                          API32¦ì¤¸VB
==============================   =============================
Int,  INT                        ByVal  Long
UNIT,  DWORD                     ByVal  Long
BOOL                             ByVal  Long    ture®É¬°1
WPARAM,  LPARAM,  LRESULT        ByVal  Long
Handle(¦pHKEY)                   ByVal  Long
WORD,  ATOM,  SHORT              ByVal  Integer
BYTE, CHAR                       ByVal  Byte

Eg.
-----------------------------------------------------------------------------
Windows API «Å§i

  SHORT GetKeyState( int  nVirtKey )

¹ïÀ³ªºVB«Å§i

 Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
-----------------------------------------------------------------------------

    ³o­ÓAPI ¥i¥Î¨ÓÀ˵ø¬Y¨ÇKEY (¦pInsertÁä¡BNum Lock¡BCapsLockµ¥)¬Oon/off¡Cµ{
¦¡¦p¤U¡G³o­Ó¨Ò¤lÀ³¸Ó¥i¤Q¤À·¡ªº¬Ý¨ì¦U­Ó¾ã¼Æ¶¡ªº«Å§i¹ïÀ³¡C

-----------------------------------------------------------------------------
Dim InsertMode as Integer
InsertMode = GetKeyState(vbKeyInsert) And vbShiftMask
If InsertMode = 1 then
  Debug.print "ªí¥Ü Insert Mode"
Else
  Debug.print "ªí¥Ü OverWrite Mode"
End If
-----------------------------------------------------------------------------
¤G¡B «ü¦V¾ã¼Æªº«ü¼Ð

Windows API                   32¦ì¤¸VB
============================  ==========================
LPINT                         (ByRef )  Long
LPUNIT                        (ByRef )  Long
LPBOOL                        (ByRef )  Long
LPDWORD                       (ByRef )  Long
LPHANDLE (¦p:PHKEY)           (ByRef )  Long
LPWORD                        (ByRef )  Integer
LPSHORT                       (ByRef )  Integer
LPBYTE                        (ByRef )  Byte

      VB¤º©w¬O¨Ï¥Î¶Ç§}©I¥s¡A©Ò¥HByRef ¥i¥H¬Ù²¤¡A¤]´N¬O»¡
   Func(ByRef param1 as type)
     »P
   Func(param1 as  type)
¬O¬Û¦Pªº¡A¨Ï¥Î¶Ç§}©I¥sªº¤è¦¡¡A¤£¥~¥G·Q±N°Ñ¼Æ¶Çµ¹API «á±Nµ²ªG¶Ç¦^¨Ó¡CµM¦ÓLONG
«¬ºAªº¶Ç§}©I¥s¦bVB¤¤¤S¦û¤F¬Û·í¤jªº¥÷¶q¡A¦]¬°32¦ì¤¸ªº«ü¼Ð³£¬OLONGªº«¬ºA¡A¦Ó¦r
¦ê¡B¦Û©w«¬ºAªºStructure¦bWindows API¤¤¬O¥H«ü¼Ð¨Ó¶Ç»¼ªº¡A¦Ó«ü¼Ðªº¶Ç»¼¨Æ¹ê¤W¤]
¬OLong­Èªº¶Ç»¼¡A¥u¤£¹L¶Ç¹L¥hªºLONG­È¡A©óWIN API¤¤·|±N¤§·í¦¨Address¡A¦Ó¦A°t¦X
«ü¼Ð¹B§@¦Ó±o«ü¼Ð©Ò«üªº¤º®e¡A³o­ÓÆ[©À¦b«á­±·|«Ü­«­n¡C

¨Ò¦p:
-----------------------------------------------------------------------------
LONG RegOpenKeyEx(
    HKEY        hKey,           // handle of open key
    LPCTSTR     lpszSubKey,     // address of name of subkey to open
    DWORD       dwReserved,     // reserved
    REGSAM      samDesired,     // security access mask
    PHKEY       phkResult       // address of handle of open key
   );
¬Û¹ïÀ³ªºVB «Å§i
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
        (ByVal hKey As Long, _
         ByVal lpSubKey As String, _
         ByVal ulOptions As Long,  _
         ByVal samDesired As Long, _
         phkResult As Long)  As Long   '//³Ì«á¤@­Ó°Ñ¼Æ¬OByRef¤§«Å§i
-----------------------------------------------------------------------------

    §Ú­Ì¸g±`·|·Q­n¥Îµ{¦¡¨ÓŪ¨úRegistry¤¤ªº¸ê®Æ¡A¨Ò¦p¡G§Ú­Ì·Q±oª¾Win95ªºProdu
ct ID¸Ó¦p¦ó°µ©O¡H³o¸Ì¦³´X­ÓÆ[©À­n¥ý²M·¡¡G­º¥ý¡GProductId¦b¦ó³B©O¡H¦b

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVerson¤UªºProductId¡C

§Ú­Ì­n¨ú±oªº«K¬O

KEY       ¬° HKEY_LOCAL_MACHINE
SUBKEY    ¬° SOFTWARE\Microsoft\Windows\CurrentVerson
ValueName ¬° ProductId ªºvalue

    µM¦Ó­n¨ú±oProductIdªºvalue¥i¨S¨º»òª½±µ¡A­n¥ý¨ú±oSubKeyªºKeyHandle¦ÓKey
Handleªº¨ú±o«K¬O§Q¥ÎRegQueryKeyExªºAPI ¡Cµ{¦¡³¡¥÷¦b¤¶²ÐWin API¦r¦ê¶Ç»¼®É¦A¤@
¨Ö¤¶²Ð¡C

¤T¡B ¦r¦ê°Ñ¼Æ

    ¤Z¬O©Ò¦³¦r¦ê°Ñ¼Æ«ü¼Ð³£¥H ByVal °Ñ¼Æ¦WºÙ As String ¶Ç¡C¦pRegOpenKeyEx()ªº
²Ä¤G°Ñ¼Æ ByVal lpSubKey As String,«K¬O¤@¨Ò¡C©Î³\·|°Ý¡A³o­Ó¨Ò¤l¬O§âsubkey­È¶Ç
µ¹ Win API©Ò¥H¥ÎByVal¡A¨S¤°»ò¤j¤£¤F¡A¨ä¹ê¤£µM¡A­nWin API¶Ç¦^¦r¦ê®É¡A¤]¤@©w­n
¥ÎByValªº«Å§i¡C³o¬OVB5¦r¦ê®æ¦¡(BSTR)»PWIN API¼Ð·Ç¦r¦ê®æ¦¡(LPSTR)¤£¦Pªº¦]¯À¡C
LPSTR ¦r¦ê®æ¦¡¬ONULL Terminateªº¦r¦ê¡A­Y¦³¤@¦r¦ê"HaHa !OK!"¡A«h®æ¦¡¦p¤U¡G


-----------------------------------------------------------------------------
Address  0  1  2  3  4  5  6  7  8  9
         -- -- -- -- -- -- -- -- -- --
¤º®e     H  a  H  a  !     O  K  !  \0

¦ÓBSTR«h¦b¦r¦êªº«e­±ÁÙ¦³¤@­ÓLONG­È¦s¦r¦êªø«×¡A®æ¦¡¦p¤U¡G

Address  0.. 3  4  5  6  7  8  9  10 11 12 13
         ------ -- -- -- -- -- -- -- -- -- --
¤º®e        9   H  a  H  a  !     O  K  !  \0
-----------------------------------------------------------------------------

    ©Ò¥H¤F¦r¦ê¥HByValªº¤è¦¡¨Ó¶Ç¹³¤£¹³«ü¨ìBSTR¤¤²Ä4­Ó¦ì¸m¡A¦p¦¹¤@¨Ó¡A¤£´N©MLP
STR ¥i¥H¬Û®e¤F¶Ü¡H§Ú·Q¤]¥¿¦]¬°¦p¦¹¥HByValªº¤è¦¡¨Ó¶ÇString¥i¥H¨ú±oWin APIªº¶Ç
¦^­È¡A(´Nºâ¤£¬O¦p¦¹¡A¦Ü¤Ö³o»ò·Q¤ñ¸û°O±o¦íString­n¥ÎByValªº¤è¦¡¶Ç)¡C²{¦b¤S¦³¤@
­Ó°ÝÃD¡AWindow95 APIªº¦r¦ê¨Ï¥Îªº¬OASCII Code¦ýVB¬O¥ÎUnicode¡AUnicode¦û¨â­Ó¦ì
¤¸²Õ¡A¨º»ò¯à©MWinAPIªº¦r¦ê¬Û¡H©Ò©¯§Ú­Ì¥i¥H¥ý¤£¥ÎºÞ¥¦¡A¦]¬°vb¥»¨­°µ¤FÂà´«¡A§Y
vb¶Çµ¹api®É¡AÂà¤F¤@¦¸¡A¶Ç¦^®É¤SÂà¦^ Unicode¡A©Ò¥H¦pªG§Ú­Ì¥Îªº¬OByte Array¨Ó
¶Ç¦r¦ê¡A¤]¥i¥H¦ý¬O­n¦Û¤v¥hÂà½X¡C
¡CµM¦Ó32¦ì¤¸ªºVB ¤¤¡A¦r¦ê¦³ºØ®æ¦¡¡A¤@­Ó¬OBSTR¡A¥t¤@­Ó¬OHLSTR¡A¦pªG§Ú­Ì«Å§iªº
¦ê¬O«D©T©wªø«×ªÌ¡A´N·|¬OBSTR¡A¤Ï¤§«h¬°HLSTR¡C

        DIM  BSTR5   AS  STRING         a BSTR
        DIM  HLSTR5  AS  STRING(255)    a HLSTR

    VB5-WIN32 API?|eE(BSTR
ao(HLSTR?P?/
VB??ZHLSTR
-> BSTR?IU?|eWIN APIa	3TSTRING
??ZBSTR->HLSTR?a\6
(
BSTR?a\B
aU	3T3T<
    2.3T?
?d3T<-?WC

    
??:
-----------------------------------------------------------------------------
int GetWindowText(
    HWND        hWnd,           // handle of window or control with text
    LPTSTR      lpString,       // address of buffer for text
    int         nMaxCount       // maximum number of characters to copy
   );
   r API O?WINDOW  Title Bar??W

3TelpString?character
x
VB?¢GJ?


Decl are Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
       (ByVal hwnd As Long,  _
        ByVal lpString As String,  _
        ByVal cch As Long)  As Long
A?
*****************************************************************************
Dim CharCnt As Long
Dim lpString As String
Dim tmpstr As String
Dim NullPos As Long

Form1.Caption = "/
test"
lpString = String(255, 0)  '-?<
CharCnt = GetWindowText(Me.hwnd, lpString, 256)  'CharCnt = 12
tmpstr = Left(lpString, CharCnt)'?dZ	?OL
Debug.Print Len(tmpstr)   '?12
Label1.Caption = Left(lpString, CharCnt)
Debug.Print Len(Label1.Caption) '?8
*****************************************************************************

    aA???P?

-?lpString= String(255,0)?i?
/-?255
WC?
z?f lpString(?
??nullq256)
CharCnt?A
?K?¢Fa
3A?<2?yia
F/(a	?OL
??lpType/REG_DWORD
¢G?lpDataaByRef?1?	OL
F/??lpType /REG_SZ
STRING/?aByVal
?1?¢GJ
@a	]?

az?11/9eAPI¢F?aCopy2??¢GJ

-----------------------------------------------------------------------------
Declare Function RegQueryLong Lib "advapi32.dll" Alias "RegQueryValueExA" _
     (ByVal hKey As Long, _
      ByVal lpValueName As String, _
      ByVal lpReserved As Long, _
      lpType As Long,  _
      lpData As Long, _
      lpcbData As Long) As Long

Declare Function RegQueryString Lib "advapi32.dll" Alias "RegQueryValueExA" _
     (ByVal hKey As Long, _
      ByVal lpValueName As String, _
      ByVal lpReserved As Long, _
      lpType As Long,  _
      Byval lpData As String, _
      lpcbData As Long) As Long
-----------------------------------------------------------------------------
    (i
¢GJ?az
OL
?

?lpType|e

?y
slpType= REG_
DWORDB
|eRegQueryLong, lpType = REG_SZBGoRegQueryString_ia?
?aoUVB API?¢GJoA??	Alias?X(

A?	
*****************************************************************************
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long)  _
        As Long
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA"
  (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
   ByVal samDesired As Long, phkResult As Long) As Long
Declare Function RegQueryString Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long,  _
   ByVal lpValueName As String, ByVal lpReserved As Long, _
   lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Const REG_EXPAND_SZ = 2
Const HKEY_CLASSES_ROOT = &H80000000
Const READ_CONTROL = &H20000
Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Const KEY_QUERY_VALUE = &H1
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const SYNCHRONIZE = &H100000
Const KEY_READ = ((STANDARD_RIGHTS_READ Or _
      KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or _
      KEY_NOTIFY) And (Not SYNCHRONIZE))

Dim key5 As String, ValueName as String, strBuff as String, ResultStr as String
Dim leng1 As Long, resul As Long, hkey As Long
Dim tp As Long, i As Long

key5 = " SOFTWARE\Microsoft\Windows\CurrentVerson "
resul = RegOpenKeyEx(HKEY_CLASSES_ROOT, key5, 0, KEY_READ, hkey)
   'hkey?/subkey (key5)?KeyHandle
HO??MyXOSubkeyg?ValueName
ValueName= "ProDuctId "
tp = REG_SZ
strBuff = String(255, 0)
leng1 = Len(strBuff) + 1
resul = RegQueryString(hkey, ValueName, 0, tp, strBuff, leng1)
   'e
,	
Ax30
leng13Tcopy 0strBuff?WC
x(anci)
leng1 = InStr(1, strBuff, Chr(0), vbBinaryCompare) 'I¢X?
x(UniCode)
ResultStr = Left(StrBuff,leng1-1)   '?/ProductId?<
*****************************************************************************
    (a	ao??y%a
A?	
-	Lleng1=Len(strBuffer)+1

Li
?
?G*'
oA?/
3T<
{??-?f?
strBuff
?'b/ao1WIN API 
p0~strBuff?Null Char(ea
@a?

32?

????
M3TkestrBuff ?xi

?ArrayAx?3^

    aSWin API ?c3^/3c?wEM@
@a?
(VB-/?e?
/wEMn?eOaa
O?Windowi@(i??APIo
?
-----------------------------------------------------------------------------
UINT GetWindowsDirectory(
    LPTSTR     lpBuffer,       // address of buffer for Windows directory
    UINT       uSize           // size of directory buffer
   );                          // a?
G3Ti?WCx
VB?¢GJ(API¢F?a)
Declare Function GetWindowsDirectory Lib "kernel32" Alias  _
   "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) _
   As Long
Ko9o
Declare Function GetWindowsDirectory Lib "kernel32" Alias  _
  "GetWindowsDirectoryA" ( lpBuffer As Byte, ByVal nSize As Long) As Long

-----------------------------------------------------------------------------
A?U
*****************************************************************************
Dim  n  as  Long
Dim  Buff() as Byte
Dim  StrA  as  String

Buff = space(256)
n=GetWindowsDirectory(Buff(0), 256)
Buff = Leftb(Buff, n)
StrA = StrConv(Buff, vbUniCode)  'StrA?/Windows@(i
*****************************************************************************

    (A?U-
GetWindowsDirectory()3e?,
AxBuff(0)?/c?wE
Byte 
aVB ¢GJlpBuffer As Byte
E3N??/ByRef  Buff(0)?M@
v6?

`_ia|en=GetWindowsDirectory(Buff(1), 256)
e/3T?Mn	??

/?|eSetWindowsHo
okEx() ?01(
#?
Project
a
?eyX(?.BAS?

y>(vO01
KeyBoard Hook?
?A?

A??
*****************************************************************************
'a

?Hook.bas
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
Declare Function UnhookWindowsHookEx Lib "user32"  _
    (ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long,  _
   ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Public hnexthookproc As Long
Public Const HC_ACTION = 0
Public Const WH_KEYBOARD = 2

Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
   UnhookWindowsHookEx hnexthookproc
   hnexthookproc = 0
End If
End Sub
Public Function EnableKBDHook()
If hnexthookproc <> 0 Then
   Exit Function
End If
hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf  _
            MyKBHFunc, App.Hinstance, 0)
If hnexthookproc <> 0 Then
   EnableKBDHook = hnexthookproc
End If
End Function
Public Function MyKBHFunc(ByVal iCode As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
  '	
Ax/u??

yO

MyKBHFunc

1e??
  'SetWindowsHookex()- AddressOf??
1#?i

?eA?
  MyKBHFunc = 0
  If iCode < 0 Then
    MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
    Exit Function
  End If
If wParam = vbKeySnapshot Then  'u, 	?		0PrintScreenu
   MyKBHFunc = 1
   Debug.Print "haha"
 End If
End Function
'a

?Form
Private Sub Form_Load()
Call EnableKBDHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub
*****************************************************************************
e?K?3^

   ae?(ByRef?1?Z1?	A?'?OL
E
Za

k?E(

    ?a
a??aWin API(VB5-|e?€c	
yeCopyMemory
?¢GJ?


-----------------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32"  Alias "RtlMoveMemory" ( _
   lpvDest As Any,  lpvSource As Any, ByVal cbCopy as Long)
-----------------------------------------------------------------------------

    
yia lpvDest?momory copy 0lpvSource
?
cbCopyGah?copy

byte	?
y
iaaS
Double= WM_KEYFIRST  _
  And msg.message <= WM_KEYLAST) Then
      Debug.Print msg.message, msg.paramH
    End If
    HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)
End Function
'a

?Form1
Private Sub Form_Load()
Call EnableHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call FreeHook
End Sub
*****************************************************************************

    s0?A

Za
e?IT>(HookProc
Hook Procedure
??
aJournalRecord Hook?Hook Procedurei??c?


-----------------------------------------------------------------------------
LRESULT CALLBACK JournalRecordProc(
    int  code,                  // hook code
    WPARAM  wParam,     // undefined
    LPARAM  lParam      // o
EVENTMSG Structure?address<
);


JournalRecordProc 
E0?HookProc?/

Function HookProc(ByVal code As Long, ByVal wParam As Long,  _
                ByVal lParam As Long) As Long

-----------------------------------------------------------------------------
	?	e0,	
Ax?/
 ByVal?Long
?/X>D
EVENTMSG?M@


HMDN
e??K?Ax3^?(ByRef?1Myaz
)J?(ByVal
?1?Z
??/C?
¢G
OL
e??


-----------------------------------------------------------------------------
EVENTMSG  *p;
P = (EVENTMSG *) lParam;
-----------------------------------------------------------------------------
?d?ia( *p->message  K1?O?g1
FVBba??(?€c?
f
o
??y?lParam@?M@

Byte
Byte?Copy0
EVENTMSG??x
b

1ia?I@a?
 CopyMomory
y>
(4?
F/ CopyMomory?
?E¢GJ?

Mbi
Axy/ByRef?1
FiM
	?/lParam?g1(G
-/lParam = 25600, Address of lParam = 100100)
??(?
?¢GJ

?
|e
-- ¢GJ ----------------------------------------------------------------------
 Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
   lpvDest As Any,  lpvSource As Any, ByVal cbCopy as Long)

 CopyMomory msg ,  lParam,  Lenb(msg)
-----------------------------------------------------------------------------
¢G?WinAPI  RtlMoveMemory?0,?
Ax<=100100

0100100?M@

¢G?1?
0o??C?? (aC?(25600?M@
)@a9??E¢GJ

K?¢GJ??#P
?dVB ,?
Ax?\O3u25600(aoByVal)fRtlMoveMe
mory
¢G
1??I

----¢GJ? ---------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
   lpvDest As Any,  ByVal lpvSource As Long, ByVal cbCopy as Long)

CopyMomory msg ,  lParam,  Lenb(msg)
-----------------------------------------------------------------------------
   1RtlMoveMemory¡L(101y(

Mi
AxB
?ByRef, B

ByVal
¢G/&1??cU
¢GJ?aE

K
va_
(

b??P-
e?
¢GJ¢GJ?#P
F/|eB9

    CopyMemory msg, ByVal lParam, Lenb(msg)

(,?
AxM?
ByVal#ia?f

    a?	a
ZO
¢G1/?Hook Procedure?¢GJWK
%O?
Hook Pro
cedure/Window@|e?
@a?3f?c?HookProc()B
,	
AxaHM?
	??a?/3e25600
¢G?
HookProc()9?c

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long,  _
                 lParam As Long) As Long
-----------------------------------------------------------------------------
    ,	
Ax? ByRef?13e
@a?
(msg = lParam?OaCopyMemory?
\O
 iafs?


-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long,  _
                 lParam As Long) As Long  'lParam9ByRef
    msg = lParam
    ' CopyMemory  msg,  lParam,  Lenb(msg)  //Lif
If (msg.message >= WM_KEYFIRST  _
  And msg.message <= WM_KEYLAST) Then
      Debug.Print msg.message, msg.paramH
    End If
    HookProc = CallNextHookEx(hHook, code, wParam, lParam)
End Function
-----------------------------------------------------------------------------