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°ÏªºÈ¡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 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
3T>elpString?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(?
??null q256)
CharCnt?12
<i
0len("
/
test") /8
FCharCnt/12
@ao¢D(Left()yx?O?PW2 O
L
/UniCodeANSI String??UA
@a?
v¡L
0 ?o?A?(.1O
OPW2
/
*???
@a9(A???1
Oco
A??
*****************************************************************************
Form1.Caption = "/
test"
lpString = String(255, 0) '-?<
CharCnt = GetWindowText(Me.hwnd, lpString, 256) 'CharCnt = 12
NullPos = InStr(1, lpString, Chr(0), vbBinaryCompare)
tmpstr = Left(lpString, NullPos - 1)
lable1.Caption = tmpstr
*****************************************************************************
U Null 3^
?T0BProductId?OL
oa(RegOpenKeyEx()?O?subkey?Han
dle<
E¢DW?/(RegQueryValueEx()?O<
-----------------------------------------------------------------------------
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?¢GJ(1API¢F?a-Copy
?)
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
-----------------------------------------------------------------------------
O0
,
Ax
WIN API-/LPDWORDi/VB-?/(ByVal?13^
b?a(? lpReserved ??3Null2?
VB(|eB?( Ax?Mn
k0(?
A? )oU3Null1?Zia?o
(
-
a
J4VB?a
ByVal ?130u?
WIN APIa
?i
!VB/ByValByRef
API ??32
??1/? ??
@a?
,
Ax(API-??32?/
Address
VB
302?
¢GahAPIa?O???g1
?O?Address 0 ?g1
1Window?
Null/Address 0ba
\OOo¢D
VB¢GJ?,
Ax¢GJ1
ByVal lpReserved As Long9 ByVal lpReserved as String
(Bu?3
vbNullString 2?_iaa(
Ao
¢G1/VB
Win API?¢GJ
1/fVB
en
?
(API-?c?
?Ax
Api¢F?aK¢GJByRef?1(W2
d)
Fi¡L ?
oO?
?EEoByRef?Ax¢GJ
iaK9o
ByVal?1
e?yO?Ax?M@
?KoLong?M@aByVal3u?
Win API i9,
aSVBi/(A?13
Ice?3? Long<2?
Win API
1a
LongA
?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 a o??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