VB5.0与Windows API 间的呼叫技巧(二)
2008-02-23 06:57:41来源:互联网 阅读 ()
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所在目录
*****************************************************************************
在范例四中,GetWindowsDirectory()传入的第一个参数Buff(0)便是这阵列的起始Byte ,因VB 宣告成lPBuffer As Byte,故传过去的是ByRef Buff(0)的位址,当然了,你也可以呼叫成n=GetWindowsDirectory(Buff(1), 256),只是传回值是填在Buff(1) to Buff(n),而Buff(0)则仍为起始的Space Character(32),因为该API传回值是字元个数,再加上存於Buff中的是Byte Array故,使用Leftb()去除多出的byte,再用StrConv将Byte Array转成Unicode的字串。比照范例二的作法,我们也可以将ByteArray 改成以String的方式来做,二者可做一比较,谁比较好或比较顺畅,那见人见智,不过可以肯定的是,如果传的值是Binary的值,那麽使用Byte Array来做才对,因用String来传的话,会经过转换成UniCode的步骤,这中间会发生什麽事,没人知道。
六、CallBack Function的作法
VB的使用者通常对於这个名词有著多多少少的疑惑,或称之为"哭爸"Function,而VB5使用手册使用Window Procedure来说明,除非对Window 系统有一些了解,否则可能令人更不知所云;我使用另一个例子来说明,那便是KeyBoard Hook。什麽是KeyBoardHook 呢,简言之便是按键盘时,便会自动执行某一段Function的功能,就好比Dos时代的拦截中断向量一般。让我们先看一下设定Hook的宣告吧。
-----------------------------------------------------------------------------
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有很多种,如KeyBoard Hook, Mouse Hook, JournalRecord Hook等,所以第一个参数指明了要哪一种Hook,第二个参数便是Hook Procedure所在,也就是方才所说"自动执行某一段Function的功能"中的那一个Function,这个Function的名称可以随意给定,但有一定的参数传递规则,例如:
hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, _
AddressOf MyKBHFunc, App.Hinstance, 0)
如此设定则每当按任一个键时,程式自动会去执行 MyKBHFunc。这个Hook Function是由我们所定义,但是它是由Window自动去呼叫,而不是由我们的程式呼叫,这类的Function就叫CallBack Function。
以上面的例子来说,这个CallBack Function定义如下:
-----------------------------------------------------------------------------
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
’侦测 有没有按到PrintScreen键
If wParam = vbKeySnapshot Then
MyKBHFunc = 1
Debug.Print "haha"
End If
End Function
-----------------------------------------------------------------------------
这个KeyBoard Hook Function的目的主要是想拦截有没有按到Print Screen这个键,这个键不会在Form的KeyDown, KeyPress, KeyUp Event中作用,所以只好透过KeyBoard Hook去拦截。而CallBack Function放的位置有规定,一个是要与呼叫SetWindowsHookEx() 的地方在同样的一个Project,另外,它只能存在於.BAS档,不能放在其他地方。KeyBoard Hook的程式於范五。
范例五
*****************************************************************************
’以下程式於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
’这三个参数是固定的,不能动,而MyKBHFunc这个名称只要和
’SetWindowsHookex()中 AddressOf後的名称一样便可,不一定叫什麽
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:在VB中如何创建闪烁(标语)屏
下一篇:用VB编写标准CGI程序(上)
- VB5.0与Windows API 间的呼叫技巧(一) 2008-02-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash