VB5.0 »P Windows API ¶¡ªº©I¥s§Þ¥© ¨Ó·½¡GCWW
    ¤@¯ë·|¨Ï¥Î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         „³ BSTR
        DIM  HLSTR5  AS  STRING(255)    „³ HLSTR

    VB5¤¤WIN32 APIªº©I¥s½Ð¦h¦h¨Ï¥ÎBSTR¡A¦]¬°¨Ï¥ÎHLSTRªºµ²ªG¬O¡AVBÁÙ±o°µHLSTR
-> BSTRªºÂà´«¨Ó©I¥sWIN API­Y¦³¶Ç¦^STRING¦Ó«á¦A°µBSTR->HLSTRªº¤u§@¡CµM¦Ó¨Ï¥Î
BSTR¨Ó¤u§@®É¡A­Y³B²z¦³¶Ç¦^­ÈªºSTRING°Ñ¼Æ¡A«hÁÙ­n¦³ÃB¥~ªº°Ê§@¡G

    1.¥ýµ¹©w¦r¦êªºªì­È¡A¥B¦r¦êªºªø«×­n°÷©ñ¶Ç¦^­È¡C
    2.¶Ç¦^«á¡A¥h°£¶Ç¦^­È¤¤¦h¾lªº¦r¤¸¡C

    ©Î
¨Ò¦p:
-----------------------------------------------------------------------------
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
   );
   ¸Ó API ¨ú±oWINDOW  Title Barªº¤å¦r¡A¦Ó¶Ç¦^­È¬O©ñ¤JlpStringªºcharacter­Ó¼Æ¡C
VBªº«Å§i¦p¤U¡G

Decl are Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
       (ByVal hwnd As Long,  _
        ByVal lpString As String,  _
        ByVal cch As Long)  As Long
½d¨Ò¤@
*****************************************************************************
Dim CharCnt As Long
Dim lpString As String
Dim tmpstr As String
Dim NullPos As Long

Form1.Caption = "³o¬O¤@­Ótest"
lpString = String(255, 0)  '³]©wªì­È
CharCnt = GetWindowText(Me.hwnd, lpString, 256)  'CharCnt = 12
tmpstr = Left(lpString, CharCnt)¡@'¦p¦¹°µ·|¦³¤@¨Ç°ÝÃD
Debug.Print Len(tmpstr)   '±o12
Label1.Caption = Left(lpString, CharCnt)
Debug.Print Len(Label1.Caption) '±o8
*****************************************************************************

    ¥H½d¨Ò¤@ªº¨Ò¤l¨Ó¬Ý¡A³]©wlpString= String(255,0)ªº¥Øªº¡A¬O³]©w255­Ó¦r¤¸ªº
ªÅ¶¡µ¹ lpString(¥[¤W³Ì«áªºnull¤@¦@256)¡ACharCntªº­È¬O12¡A©ú²´ªÌ¥i¬Ý¨ìlen("³o
¬O¤@­Ótest") ·|¬O8¡A¦ýCharCnt¬O12¡A ©Ò¥Hª½±µ¨Ï¥ÎLeft()¨ç¼Æ¨Ó¨ú±o¤l¦r¦ê·|¦³°Ý
ÃD¡A³o¬OUniCode»PANSI String¶¡ªºÃö«Y¡A©Ò¥H¤F¡A·í±z¬Ý¨ì¦³¨Ç®Ñªº½d¨Ò¥Î³oºØ¤èªk
¨ú¤l¦r¦ê¡A¬O¤£¤Ó§¹µ½ªº¡A©Ò¥H§ï¥Î½d¨Ò¤Gªº¤è¦¡¡A¤ñ¸û¥¿½T¡C

½d¨Ò¤G
*****************************************************************************
Form1.Caption = "³o¬O¤@­Ótest"
lpString = String(255, 0)  '³]©wªì­È
CharCnt = GetWindowText(Me.hwnd, lpString, 256)  'CharCnt = 12
NullPos = InStr(1, lpString, Chr(0), vbBinaryCompare)
tmpstr = Left(lpString, NullPos - 1)
lable1.Caption = tmpstr
*****************************************************************************
¥|¡B Null ­Èªº¶Ç»¼

    §Ú­Ì¦A¦^¨ì¨DProductIdªº°ÝÃD¡A§Ú­Ì¤wª¾¨Ï¥ÎRegOpenKeyEx()¨Ó¨ú±osubkeyªºHan
dle­È¡Aºò±µµÛ«K¬O¥ÎRegQueryValueEx()¨Ó¨ú­È¡C

-----------------------------------------------------------------------------
LONG RegQueryValueEx(
    HKEY     hKey,              // handle of key to query
    LPTSTR   lpszValueName,     // address of name of value to query
    LPDWORD  lpdwReserved,      // reserved
    LPDWORD  lpdwType,          // address of buffer for value type
    LPBYTE   lpbData,           // address of data buffer
    LPDWORD  lpcbData           // address of data buffer size
   );
VBªº«Å§i(¥ÑAPIÀ˵ø­û¤¤Copy¤U¨ÓªÌ)
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
    (ByVal hKey As Long, _
     ByVal lpValueName As String, _
     ByVal lpReserved As Long, _
    lpType As Long,  _
    lpData As Any, _
    lpcbData As Long) As Long
-----------------------------------------------------------------------------
    ¥J²Ó¬Ý¤@¤U²Ä¤T­Ó°Ñ¼Æ¡AWIN API¤¤¬OLPDWORD¥i¬OVB¤¤»ò·|¬O¥ÎByValªº¤è¦¡¶Ç»¼
©O¡H­ì¦]¦b©ó lpReserved¤@©w­n¶ÇNull¶i¥h¡AVB¦b©I¥s®É«K¦b ³o°Ñ¼Æªº¦ì¸m¤W¶ñ0(¨£
½d¨Ò¤T)¡C¬°¦ó¶ÇNull´N±o³o°µ¡H§Ú­Ì¥i¥H³o»ò·Q¡A§Ú­Ì ¦bµ{¦¡¤¤¤U«ü¥O¡A§i¶DVB­n¥H
ByVal ªº¤è¦¡¶Ç0¥X¥h¡A¦ÓWIN API¸Ì¡A¥¦¥i¤£ºÞVB¬OByVal©ÎByRef¡AAPI »{©w§Ú­Ì¶Ç¶i
¨Óªº´N¬O¥¦»Ý­nªº¡A©Ò¥H¤F¡A²Ä¤T­Ó°Ñ¼Æ¦bAPI¤¤»{©w§Ú­Ì¶Ç¶iªº¬O¤@­ÓAddress¡A¦ÓVB
¶Ç0¶i¥h¡A¨º¥NªíAPI­Y¥h¨ú±o¥¦ªº¤º®e¡A«K·|¨ú±oAddress 0 ªº¤º®e¡A©Î³\Windowªº
Null­È«K¬O«ü¦VAddress 0©O¡I¥t¤@­Ó§@ªk¤ñ¸ûª½±µ¡A±NVB«Å§iªº²Ä¤T­Ó°Ñ¼Æ«Å§i¥Ñ
ByVal lpReserved As Long§ï¦¨ ByVal lpReserved as String¦Ó¨Ï¥Î®É©T©w¶Ç
vbNullString ¶i¥h¤]¥i¥H¡C³o¸Ì¦b¤@­ÓÆ[©À¡A¨º´N¬OVB¹ïWin APIªº«Å§i¡A¯Âºé¬Oµ¹VB
¦Û¤v¬Ýªº¡A¦bAPI¤¤©w¸q¤F¤@­Ó«ü¼Ðªº°Ñ¼Æ¡AApiÀ˵ø­û·|±N¤§«Å§i¦¨ByRefªº¤è¦¡(¦r¦ê
°£¥~)¡A¦ý§Ú­Ì¥iÀH»Ý­n¦Ó§ó°Ê¥¦¡A¤@­Ó­ì©lÀ³¬°ByRefªº°Ñ¼Æ«Å§i¡A§Ú­Ì¥i¥H±N¤§§ï¬°
ByValªº¤è¦¡¡A¥u­n§Ú­Ì¯à¨ú±o°Ñ¼Æªº¦ì§}¡A¦Ó±N³o«¬ºA¬°Longªº¦ì§}¥HByVal¶Ç¥X¥h¡A
Win API ºÝ®Ú¥»¤£ª¾¹DVBºÝ¬O¥Î¤°»ò¤è¦¡¶Ç¡A¤Ï¥¿¥u­n§Ú­Ì¶Ç¤F¤@Long­È¶i¥h¡AWin API
´N·|¥H³o­ÓLong­È·í§@¬OAddress¨Ó¹B§@¡C

    °ÝÃDÁÙ¨S¦³¸Ñ¨M¡ARegQueryValueEx()ªº²Ä¥|­Ó°Ñ¼ÆlpType­Y¬°REG_SZ(= 1)¨º¥Nªí
lpData¬ONull TerminateªºString¡A­Y¬°REG_DWORD ( = 4)¨º¥NªílpData¬OLong­È¡A¥¿
¬O¦]¬°¨S¦³¿ìªk¨Æ¥ýª¾¹DlpDataªº¯u¥¿«¬ºA¡A©Ò¥HVB´N¨Ï¥Î ASAnyªº«¬ºA¡A¥¦­nVB©ñ±ó
«¬ºAªºÀˬd¡A¶Ç¤°»ò­È¶i¥h³£¥i¥H¡A¦ý¬O¦b³o¸Ì¦³¤@¨Ç°ÝÃD¡A¦pªGlpType¬OREG_DWORD
¨º»òlpData¥HByRefªº¤è¦¡¨S¦³°ÝÃD¡A¦ý¬O¦pªGlpType ¬OREG_SZ¡ASTRING¬O­n¥HByVal
ªº¤è¦¡¨Ó«Å§i¡A©Ò¥H·|¦³½Ä¬ð¡A¦Ó¸Ñ¨Mªº¤è¦¡´N¬O§ï¼gAPIÀ˵ø­ûCopy¶i¨Óªº«Å§i¡C

-----------------------------------------------------------------------------
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¨Ó¸Ñ¨M³o­Ó°ÝÃD¡A¨Ì¤£¦PªºlpType©I¥s¤£¦Pªº¨ç¦¡¡A§YlpType= REG_
DWORD®É¡A©I¥sRegQueryLong, lpType = REG_SZ®É«h¬°RegQueryString³o¤]¥i¥HÅý§Ú­Ì
¤F¸Ñ¬°¦óVB APIªº«Å§i¬°¤°»ò­n¦³Aliasªº¦s¦b¡C

½d¨Ò¤T
*****************************************************************************
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«K¬Osubkey (key5)ªºKeyHandle¡A¥ý¨ú±o¥¦¤~¯à¦s¨úSubkey¤ºªºValueName
ValueName= "ProDuctId "
tp = REG_SZ
strBuff = String(255, 0)
leng1 = Len(strBuff) + 1
resul = RegQueryString(hkey, ValueName, 0, tp, strBuff, leng1)
   'ª`·N¡A²Ä¤T­Ó°Ñ¼Æ¶Ç0¡Aleng1¶Ç¦^copy ¨ìstrBuffªº¦r¤¸­Ó¼Æ(anci)
leng1 = InStr(1, strBuff, Chr(0), vbBinaryCompare) '­«·sºâ­Ó¼Æ(UniCode)
ResultStr = Left(StrBuff,leng1-1)   '³o«K¬OProductIdªº­È
*****************************************************************************
    ¦b³o¸Ì¦³¥t¥~¤@¥ó¨Æ­n¯S§O»¡©ú¡A½d¨Ò¤Tµ{¦¡¤¤¦³¤@¦æleng1=Len(strBuffer)+1¡A
³o¦æ¥i¬Ù¤£±o¡A«Ü©_©Ç§a¡A¬°¤°»ò©ú©ú¬O¤@­Ó¶Ç¦^­È¡A«o¤@©w­n³]©wµ¹¥¦¤@­ÓstrBuff
ªº¤j¤p©O¡H³o¬O¦]¬°³\¦hWIN API ¤£·|Áo©ú¨ì§ästrBuffªºNull Char¦b­þ¸Ì¡A©Ò¥H»Ý­n
µ{¦¡¶Ç¶i¥h¡A¦Ó«á¥¦¦A¨Ì³o­ÓÄæ¦ì¶Ç¦^¶ñ¤JstrBuff ªº¼Æ¥Ø¡C

¤­¡BArray°Ñ¼Æªº¶Ç»¼

    §Ú­Ìª¾¹DWin API ªº°}¦C¶Ç»¼¬O¶Ç°}¦Cªº°_©l¦ì§}¡A©Ò¥H¤F¡A¦bVB¤¤°ß¤@­nª`·Nªº
¬O°_©l¦ì¸mªº¼gªk¡C¥H¥t¤@­Ó¨ú±oWindow¥Ø¿ý©Ò¦b¸ô®|ªºAPI¬°
¨Ò¡G
-----------------------------------------------------------------------------
UINT GetWindowsDirectory(
    LPTSTR     lpBuffer,       // address of buffer for Windows directory
    UINT       uSize           // size of directory buffer
   );                          // ­Y¦¨¥\¡A«h¶Ç¦^¥Ø¿ýªº¦r¤¸¼Æ
VBªº«Å§i(APIÀ˵ø­û)
Declare Function GetWindowsDirectory Lib "kernel32" Alias  _
   "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) _
   As Long
§Ú­Ì±N¤§§ó§ï¬°
Declare Function GetWindowsDirectory Lib "kernel32" Alias  _
  "GetWindowsDirectoryA" ( lpBuffer As Byte, ByVal nSize As Long) As Long

-----------------------------------------------------------------------------
½d¨Ò¥|
*****************************************************************************
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«K¬OWindows©Ò¦b¥Ø¿ý
*****************************************************************************

    ¦b½d¨Ò¥|¤¤¡AGetWindowsDirectory()¶Ç¤Jªº²Ä¤@­Ó°Ñ¼ÆBuff(0)«K¬O³o°}¦Cªº°_©l
Byte ¡A¦]VB «Å§i¦¨lpBuffer As Byte¡A¬G¶Ç¹L¥hªº¬OByRef  Buff(0)ªº¦ì§}¡A·íµM¤F
¡A§A¤]¥i¥H©I¥s¦¨n=GetWindowsDirectory(Buff(1), 256)¡A¥u¬O¶Ç¦^­È¬O¶ñ¦bBuff(1)
  to  Buff(n)¡A¦ÓBuff(0)«h¤´¬°°_©lªºSpace Character(32)¡A¦]¬°¸ÓAPI¶Ç¦^­È¬O¦r
¤¸­Ó¼Æ¡A¦A¥[¤W¦s©óBuff¤¤ªº¬OByte Array¬G¡A¨Ï¥ÎLeftb()¥h°£¦h¥Xªºbyte¡A¦A¥Î
StrConv±NByte ArrayÂনUnicodeªº¦r¦ê¡C¤ñ·Ó½d¨Ò¤Gªº§@ªk¡A§Ú­Ì¤]¥i¥H±NByte
Array §ï¦¨¥HStringªº¤è¦¡¨Ó°µ¡A¤GªÌ¥i°µ¤@¤ñ¸û¡A½Ö¤ñ¸û¦n©Î¤ñ¸û¶¶ºZ¡A¨º¨£¤H¨£´¼
¡A¤£¹L¥i¥HªÖ©wªº¬O¡A¦pªG¶Çªº­È¬OBinaryªº­È¡A¨º»ò¨Ï¥ÎByte Array¨Ó°µ¤~¹ï¡A¦]¥Î
String¨Ó¶Çªº¸Ü¡A·|¸g¹LÂà´«¦¨UniCodeªº¨BÆJ¡A³o¤¤¶¡·|µo¥Í¤°»ò¨Æ¡A¨S¤Hª¾¹D¡C

¤»¡BCallBack Functionªº§@ªk

    VBªº¨Ï¥ÎªÌ³q±`¹ï©ó³o­Ó¦Wµü¦³µÛ¦h¦h¤Ö¤ÖªººÃ´b¡A©ÎºÙ¤§¬°"­úª¨"Function¡A¦Ó
VB5¨Ï¥Î¤â¥U¨Ï¥ÎWindow Procedure¨Ó»¡©ú¡A°£«D¹ïWindow ¨t²Î¦³¤@¨Ç¤F¸Ñ¡A§_«h¥i¯à
¥O¤H§ó¤£ª¾©Ò¤ª¡F§Ú¨Ï¥Î¥t¤@­Ó¨Ò¤l¨Ó»¡©ú¡A¨º«K¬OKeyBoard Hook¡C¤°»ò¬OKeyBoard
Hook ©O¡A²¨¥¤§«K¬O«öÁä½L®É¡A«K·|¦Û°Ê°õ¦æ¬Y¤@¬qFunctionªº¥\¯à¡A´N¦n¤ñDos®É¥N
ªºÄdºI¤¤Â_¦V¶q¤@¯ë¡CÅý§Ú­Ì¥ý¬Ý¤@¤U³]©wHookªº«Å§i§a¡C

-----------------------------------------------------------------------------
HHOOK SetWindowsHookEx(
    int         idHook,         // type of hook to install
    HOOKPROC    hkprc,          // address of hook procedure
    HINSTANCE   hMod,           // handle of application instance
    DWORD       dwThreadID      // identity of thread to install hook for
   );

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

-----------------------------------------------------------------------------
    Hook¦³«Ü¦hºØ¡A¦pKeyBoard  Hook, Mouse Hook, JournalRecord Hookµ¥¡A©Ò¥H²Ä
¤@­Ó°Ñ¼Æ«ü©ú¤F­n­þ¤@ºØHook¡A²Ä¤G­Ó°Ñ¼Æ«K¬OHook Procedure©Ò¦b¡A¤]´N¬O¤è¤~©Ò»¡
"¦Û°Ê°õ¦æ¬Y¤@¬qFunctionªº¥\¯à"¤¤ªº¨º¤@­ÓFunction¡A³o­ÓFunctionªº¦WºÙ¥i¥HÀH·N
µ¹©w¡A¦ý¦³¤@©wªº°Ñ¼Æ¶Ç»¼³W«h¡A¨Ò¦p¡G
       hnexthookproc = SetWindowsHookEx(WH_KEYBOARD,  _
                     AddressOf  MyKBHFunc, App.Hinstance, 0)
    ¦p¦¹³]©w«h¨C·í«ö¥ô¤@­ÓÁä®É¡Aµ{¦¡¦Û°Ê·|¥h°õ¦æ MyKBHFunc¡C³o­ÓHook Function
¬O¥Ñ§Ú­Ì©Ò©w¸q¡A¦ý¬O¥¦¬O¥ÑWindow¦Û°Ê¥h©I¥s¡A¦Ó¤£¬O¥Ñ§Ú­Ìªºµ{¦¡©I¥s¡A³oÃþªº
Function´N¥sCallBack Function¡C¨ä¹ê¡A¦³­Ó§óª½Ä±ªº¨Ò¤l¡A¨º´N¬O¨Æ¥ó(Event)¡F
¤ñ¦p»¡Form²£¥Í®É·|¦³¤@­ÓForm_Load¨Æ¥ó¡A¦b³o­Ó¨Æ¥ó¤º§Ú­Ì¥i¥H¼g«Ü¦hµ{¦¡¡A¦ý³o¨Ç
µ{¦¡¤£¬Oµ¹§Ú­Ì¨ä¥LªºProcedure©I¥sªº¡A¦Ó¬OForm¦bLoad¶i¨Ó®É¡A¥ÑWindow¥h©I¥sªº¡A
³o«K¬OCallBack Function¡C

¥H¤W­±ªº¨Ò¤l¨Ó»¡¡A³o­ÓCallBack Function©w¸q¦p¤U¡G
-----------------------------------------------------------------------------
Public Function MyKBHFunc(ByVal iCode As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
  MyKBHFunc = 0
  If iCode < 0 Then
    MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
    Exit Function
  End If
 '°»´ú ¦³¨S¦³«ö¨ìPrintScreenÁä
 If wParam = vbKeySnapshot Then
   MyKBHFunc = 1

   Debug.Print "haha"
 End If
End Function
-----------------------------------------------------------------------------

    ³o­ÓKeyBoard Hook Functionªº¥Øªº¥D­n¬O·QÄdºI¦³¨S¦³«ö¨ìPrint Screen³o­ÓÁä
¡A³o­ÓÁ䤣·|¦bFormªºKeyDown, KeyPress, KeyUp Event¤¤§@¥Î¡A©Ò¥H¥u¦n³z¹LKeyBoa
rd Hook¥hÄdºI¡C¦ÓCallBack Function©ñªº¦ì¸m¦³³W©w¡A¤@­Ó¬O­n»P©I¥sSetWindowsHo
okEx() ªº¦a¤è¦b¦P¼Ëªº¤@­ÓProject¡A¥t¥~¡A¥¦¥u¯à¦s¦b©ó.BASÀÉ¡A¤£¯à©ñ¦b¨ä¥L¦a¤è
¡CKeyBoard Hookªºµ{¦¡©ó½d¤­¡C

½d¨Ò¤­
*****************************************************************************
'¥H¤Uµ{¦¡©ó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
  '³o¤T­Ó°Ñ¼Æ¬O©T©wªº¡A¤£¯à°Ê¡A¦ÓMyKBHFunc³o­Ó¦WºÙ¥u­n©M
  'SetWindowsHookex()¤¤ AddressOf«áªº¦WºÙ¤@¼Ë«K¥i¡A¤£¤@©w¥s¤°»ò
  MyKBHFunc = 0
  If iCode < 0 Then
    MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
    Exit Function
  End If
If wParam = vbKeySnapshot Then  '°»´ú ¦³¨S¦³«ö¨ìPrintScreenÁä
   MyKBHFunc = 1

   Debug.Print "haha"
 End If
End Function
'¥H¤Uµ{¦¡©óForm
Private Sub Form_Load()
Call EnableKBDHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub
*****************************************************************************
¤C¡B¦Û­q«¬ºAªº¶Ç»¼

   ¦]³o¥u­n¥ÎByRefªº¤è¦¡¨Ó°µ´N¨S¦³¤°»ò¤jªº°ÝÃD¡A¬G¤£°µ»¡©ú¡C

¤K¡Bºî¦XÀ³¥Î

    §Ú­Ì¦A¥H¤@­Ó¹ê¨Ò¨Ó»¡©úWin API¦bVB5¤¤©I¥sªº§Þ¥©¡C¦³¤@­Ó¨ç¦¡¥sCopyMemory
ªº«Å§i¦p¤U¡G

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

    ³o­Ó¨ç¦¡¥i¥H±N lpvDestªºmomory copy ¨ìlpvSource¤W¥h¡AcbCopy«h¥Nªí­ncopy
¦h¤Ö­Óbyte¡C¦³¤F³o­Ó¨ç¦¡¡A§Ú­Ì¥i¥Hª¾¹D¤@­ÓDouble­È¦s¦bMemory¤¤ªº¦U­Óbyte¨ì©³
¬O¦h¤Ö¡C

-----------------------------------------------------------------------------
Dim  dbl  as  Double
Dim  bte(0 to 7) as Byte
Dbl = 168.256

CopyMemory dbl,  byt(0),  8
-----------------------------------------------------------------------------

    ¦p¦¹À˵øbte°}¦C«K¥i¥Hª¾¹D³oDouble­Èªº¦U­Óbyte¬O¦h¤Ö¡C¦A¥H¥t¤@­Ó
JournalRecord Hook¬°¨Ò¨Ó»¡©ú¡G

½d¨Ò¤»
*****************************************************************************
' ¥H¤U¦bHook.bas
Const WM_MOUSELAST = &H209

Const WM_MOUSEFIRST = &H200

Public Const WM_KEYLAST = &H108

Public Const WM_KEYFIRST = &H100

Public Const WH_JOURNALRECORD = 0

Type EVENTMSG
        message As Long
        paramL As Long
        paramH As Long
        time As Long
        hwnd As Long
End Type
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
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory"  _
  (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public hNxtHook As Long   ' handle of Hook Procedure
Public msg As EVENTMSG

Sub EnableHook()
   hNxtHook = SetWindowsHookEx(0, AddressOf HookProc, App.hInstance, 0)
End Sub
Sub FreeHook()
    Dim ret As Long
    ret = UnhookWindowsHookEx(hNxtHook)

End Sub
Function HookProc(ByVal code As Long, ByVal wParam As Long,  _
                ByVal lParam As Long) As Long
    CopyMemory  msg,  lParam,  Lenb(msg)
If (msg.message >= WM_KEYFIRST  _
  And msg.message <= WM_KEYLAST) Then
      Debug.Print msg.message, msg.paramH
    End If
    HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)
End Function
'¥H¤Uµ{¦¡©óForm1
Private Sub Form_Load()
Call EnableHook
End Sub

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

    ¸Ô²Óªº¬yµ{¤£¦h°µ»¡©ú¡A§Ú­Ì¥u§â­«ÂI©ñ¦bHookProc³o­ÓHook Procedure¡A¦pªG§Ú
­Ì¬dJournalRecord HookªºHook Procedure¥i±o©w¸q¦p¤U¡G

-----------------------------------------------------------------------------
LRESULT CALLBACK JournalRecordProc(
    int  code,                  // hook code
    WPARAM  wParam,     // undefined
    LPARAM  lParam      // ¬°¤@­ÓEVENTMSG Structureªºaddress­È
);

³o­ÓJournalRecordProc ¹ïÀ³¨ì§Ú­ÌªºHookProc«K¬O

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

-----------------------------------------------------------------------------
¦³¨S¦³ª`·N¨ì²Ä¤T­Ó°Ñ¼Æ¥¦¬O¤@­Ó ByValªºLong¡A«üªº¬O¦s©ñ¬Y¤@­ÓEVENTMSGªº¦ì§}¡A
¦Ó¥ý«e§Ú­Ì´£¹L¡A¦Û©w«¬ºAªº°Ñ¼Æ¶Ç»¼­n¨Ï¥ÎByRefªº¤è¦¡¤~¯à¸Ñ¨M¡A¤Ñ°Ú¡I¥¦¥ÎByVal
ªº¤è¦¡¨Ó°µ¡A¦pªG¬OC»y¨¥¡A¨º¤£¦¨°ÝÃD¡A¥u­n¦p¤U¡G

-----------------------------------------------------------------------------
EVENTMSG  *p;
P = (EVENTMSG *) lParam;
-----------------------------------------------------------------------------
¦p¦¹«K¥i¥H¥Î *p->message  ¤§¤è¦¡¨Ó¨ú±o¤º®e¡A¦ýVB©O¡H³o¸Ì«K­n¥Î¨Ç¤p§Þ¥©¤F¡A¸Õ
·Q¡A¦pªG§Ú­Ì¯à¨ÌlParam©Ò«üªº¦ì§}¡A¤@­ÓByte¤@­ÓByteªºCopy¨ì¤@­ÓEVENTMSGªºÅܼÆ
¤W­±¡A¤£´N¥i¥H¤F¶Ü¡H©Ò¥H¤F¡A CopyMomory³o­Ó¨ç¦¡¬£¤W¥Î³õ¤F¡A¦ý¬O CopyMomoryªº
­ì©l«Å§i¦p¤U¡A«e­±¨â­Ó°Ñ¼Æ³£¬OByRefªº¤è¦¡¡A¦ý¥Ø«e¹ï§Ú­Ì¦³ªº¬OlParamªº¤º®e(°²
³]¬OlParam = 25600, Address of lParam = 100100)¡A¦pªG§Ú­Ì¨Ï¥Î©³¤Uªº«Å§i¡A¦Ó¥h
©I¥s
-- «Å§i¤@ ----------------------------------------------------------------------
 Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
   lpvDest As Any,  lpvSource As Any, ByVal cbCopy as Long)

 CopyMomory msg ,  lParam,  Lenb(msg)
-----------------------------------------------------------------------------
¨º»òWinAPI  RtlMoveMemory·|±o¨ì²Ä¤G­Ó°Ñ¼Æ­È=100100¡A¦Ó¨Ï«ü¼Ð«ü¨ì100100ªº¦ì§}
¡A¨º»ò´N±o¤£¨ì·Q­nªº¸ê®Æ¤F (¦]¸ê®Æ¦b25600ªº¦ì§}¤W)¡C©Ò¥H§Ú­Ì§ïÅÜ­ì©l«Å§i¡A±N
¤§Åܦ¨«Å§i¤Gªº¼Ë¤l¡A¦p¦¹VB ²Ä¤G­Ó°Ñ¼Æªº§@ªk·|¶Ç¥X25600(¦]¬°ByVal¹À)µ¹RtlMoveMe
mory¡A¨º¤£´N¦¨¥\¤F¶Ü¡H

----«Å§i¤G ---------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
   lpvDest As Any,  ByVal lpvSource As Long, ByVal cbCopy as Long)

CopyMomory msg ,  lParam,  Lenb(msg)
-----------------------------------------------------------------------------
   ©Î³\³oRtlMoveMemory±z¦b³\¦h¦a¤è³£·|¥Î¤W¡A«e¨â­Ó°Ñ¼Æ®É¦Ó­nByRef, ®É¦Ó»Ý
ByVal¡A¨º¬O§_´N­n©w¸q¥|­Ó«Å§i¨Ó¦]À³¤£¦P¤§»Ý¡A¨ä¹ê¤]¤£¥Î¡A¤W­±ªº¨Ò¤l¤¤¡A¥u­n
«Å§i¦¨«Å§i¤@ªº¼Ë¤l¡A¦ý¬O©I¥s®É§ï¦¨¡G

    CopyMemory msg, ByVal lParam, Lenb(msg)

¦b²Ä¤G­Ó°Ñ¼Æ«e¥[¤WByVal³o¼Ë³o¥i¥H¤F°Õ¡C

    ³o¸ÌÁÙ¦³¥t¥~¤@­Ó°µªk¡A¨º´N¬O±qHook Procedureªº«Å§iµÛ¤â¡A§O§Ñ¤F¡AHook Pro
cedure¬OWindow©Ò©I¥sªº¡A©Ò¥H¥¦¶Çµ¹§Ú­Ì©w¸qªºHookProc()®É¡A²Ä¤T­Ó°Ñ¼Æ¥H¥ý«eªº
Á|¨Ò¨Ó»¡«K¬O¶Ç¤J25600¡A¨º»ò¡A§Ú­Ì±NHookProc()§ï©w¸q¦¨¡G

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long,  _
                 lParam As Long) As Long
-----------------------------------------------------------------------------
    ²Ä¤T­Ó°Ñ¼ÆÅܦ¨ ByRefªº¤è¦¡¶Ç¤J¡A©Ò¥H¤F¡A¥Îmsg = lParam¨Ó¨ú¥NCopyMemoryªº
§@ªk¡A ¹À¥i¥H³q°Õ¡I§Y¦p¤U¡G

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long,  _
                 lParam As Long) As Long  'lParam§ï¦¨ByRef
    msg = lParam
    ' CopyMemory  msg,  lParam,  Lenb(msg)  //³o¦æ¥i¬Ù°Õ
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
-----------------------------------------------------------------------------

¤p®£Às¤u§@§{ ´£¨Ñ