| 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°ÏªºÈ¡AnŪ¡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±`·|·Qn¥Îµ{¦¡¨ÓŪ¨ú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¨º»òª½±µ¡An¥ý¨ú±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¡AnWin API¶Ç¦^¦r¦ê®É¡A¤]¤@©wn
¥ÎByValªº«Å§i¡C³o¬OVB5¦r¦ê®æ¦¡(BSTR)»PWIN API¼Ð·Ç¦r¦ê®æ¦¡(LPSTR)¤£¦Pªº¦]¯À¡C
LPSTR ¦r¦ê®æ¦¡¬ONULL Terminateªº¦r¦ê¡AY¦³¤@¦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¦íStringn¥Î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¦ý¬On¦Û¤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 APIY¦³¶Ç¦^STRING¦Ó«á¦A°µBSTR->HLSTRªº¤u§@¡CµM¦Ó¨Ï¥Î
BSTR¨Ó¤u§@®É¡AY³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¤@©wn¶Ç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¶DVBn¥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ªíAPIY¥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¥un§Ú̯à¨ú±o°Ñ¼Æªº¦ì§}¡A¦Ó±N³o«¬ºA¬°Longªº¦ì§}¥HByVal¶Ç¥X¥h¡A
Win API ºÝ®Ú¥»¤£ª¾¹DVBºÝ¬O¥Î¤°»ò¤è¦¡¶Ç¡A¤Ï¥¿¥un§Ú̶ǤF¤@Longȶi¥h¡AWin API
´N·|¥H³oÓLongÈ·í§@¬OAddress¨Ó¹B§@¡C
°ÝÃDÁÙ¨S¦³¸Ñ¨M¡ARegQueryValueEx()ªº²Ä¥|ӰѼÆlpTypeY¬°REG_SZ(= 1)¨º¥Nªí
lpData¬ONull TerminateªºString¡AY¬°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¬On¥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¤@©wn³]©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²Ä
¤@ӰѼƫü©ú¤Fnþ¤@ºØ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ªº¥Øªº¥Dn¬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¤@Ó¬On»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ºÙ¥un©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¥un¥Î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¥un¦p¤U¡G
-----------------------------------------------------------------------------
EVENTMSG *p;
P = (EVENTMSG *) lParam;
-----------------------------------------------------------------------------
¦p¦¹«K¥i¥H¥Î *p->message ¤§¤è¦¡¨Ó¨ú±o¤º®e¡A¦ýVB©O¡H³o¸Ì«Kn¥Î¨Ç¤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¤£¨ì·Qnªº¸ê®Æ¤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§_´Nn©w¸q¥|ӫŧi¨Ó¦]À³¤£¦P¤§»Ý¡A¨ä¹ê¤]¤£¥Î¡A¤W±ªº¨Ò¤l¤¤¡A¥un
«Å§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
-----------------------------------------------------------------------------