你提的第一个问题真的很怪,既然是函数,直接传参数不行吗?如果是用VB去作ActiveX dll的话,也可以使用属性的方式去作啊。 至于你的第二个问题,首先要在你的dll中定义事件,并且在适当的时机去激发它,具体的方法和作ActiveX控件没有什么两样,用event去定义,用raiseevent去fire一个事件。然后就是在使用这个dll的程序中,和普通的dim obj as something不同,需要在前面加上withevents,这样VB的IDE环境中就会出现你定义的这个对象名(就像一个TextBox一样),后面也会出现几个事件,具体的可以参看MSDN中以withevents为关键字的文章和介绍。
谢谢各位的指点,再问一下怎样用VB才能做键盘全局HOOK,我把下面的代码封进标准的DLL为什么不行,我把封装的代码改为VB的就是这样。 ---------------------------------------------- Private Const WH_KEYBOARD As Long = 2Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As LongDim OldHook As Long Dim StrSave As StringPrivate Sub Main()
End SubPublic Function SetHook(LngAddressHook As Long, LnghInstance As Long) As Long OldHook = SetWindowsHookEx(WH_KEYBOARD, LngAddressHook, LnghInstance, 0) End FunctionPublic Sub UnloadHook() UnhookWindowsHookEx OldHook End SubPublic Function KeyBoardHook(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
KeyBoardHook = CallNextHookEx(OldHook, nCode, wParam, ByVal lParam)End FunctionPublic Sub Save() Dim IntFile As Integer MsgBox "save" IntFile = FreeFile Open "c:\Key.txt" For Output As #IntFile Print #IntFile, StrSave & "ok" Close #IntFile StrSave = "" End Sub ----------------------------------------------- 下面是我程序中的代码: Private Sub Form_Load() LngHdll = LoadLibrary(App.Path & "\KeyHook.dll") LngAddressHook = GetProcAddress(LngHdll, "KeyBoardHook") LngRet = SetHook(LngAddressHook, LngHdll) end subPrivate Sub Form_Unload(Cancel As Integer) FreeLibrary LngHdll Call UnhookWindowsHookEx(OldHook) Save End Sub ------------------------------------------------------- 请问个位大哥,为什么这样也只能监视本程序的按键,而不是全局的。请指教!!!
至于你的第二个问题,首先要在你的dll中定义事件,并且在适当的时机去激发它,具体的方法和作ActiveX控件没有什么两样,用event去定义,用raiseevent去fire一个事件。然后就是在使用这个dll的程序中,和普通的dim obj as something不同,需要在前面加上withevents,这样VB的IDE环境中就会出现你定义的这个对象名(就像一个TextBox一样),后面也会出现几个事件,具体的可以参看MSDN中以withevents为关键字的文章和介绍。
----------------------------------------------
Private Const WH_KEYBOARD As Long = 2Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As LongDim OldHook As Long
Dim StrSave As StringPrivate Sub Main()
End SubPublic Function SetHook(LngAddressHook As Long, LnghInstance As Long) As Long
OldHook = SetWindowsHookEx(WH_KEYBOARD, LngAddressHook, LnghInstance, 0)
End FunctionPublic Sub UnloadHook()
UnhookWindowsHookEx OldHook
End SubPublic Function KeyBoardHook(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
KeyBoardHook = CallNextHookEx(OldHook, nCode, wParam, ByVal lParam)End FunctionPublic Sub Save()
Dim IntFile As Integer
MsgBox "save"
IntFile = FreeFile
Open "c:\Key.txt" For Output As #IntFile
Print #IntFile, StrSave & "ok"
Close #IntFile
StrSave = ""
End Sub
-----------------------------------------------
下面是我程序中的代码:
Private Sub Form_Load()
LngHdll = LoadLibrary(App.Path & "\KeyHook.dll")
LngAddressHook = GetProcAddress(LngHdll, "KeyBoardHook")
LngRet = SetHook(LngAddressHook, LngHdll)
end subPrivate Sub Form_Unload(Cancel As Integer)
FreeLibrary LngHdll
Call UnhookWindowsHookEx(OldHook)
Save
End Sub
-------------------------------------------------------
请问个位大哥,为什么这样也只能监视本程序的按键,而不是全局的。请指教!!!