'VB Form_Code:
Option ExplicitPrivate Declare Function RegHook Lib "SetMouseHook.dll" (ByVal hwnd As Long) As Boolean
Private Declare Function RemoveHook Lib "SetMouseHook.dll" () As BooleanPrivate Sub Command1_Click()
Text1.Text = CStr(RegHook(AddressOf MyFun))
End SubPrivate Sub Command2_Click()
Text1.Text = CStr(RemoveHook)
End Sub
------------------------------------------------------------------------
'VB Module_Code:
Option Explicit
Dim SY As LongPublic Function MyFun() As Long
SY = SY + 1
Main.Text2.Text = CStr(SY)
MyFun = True
End Function
------------------------------------------------------------------------
//Delphi_Code:
library MouseHook;uses
SysUtils,
WinTypes,
WinProcs,
Messages;{$R *.res}
type
FuncType = Function():longint;//Short;
var
IsHooked:boolean;
HookHandle:hhook;
DesktopWin:hwnd;
FunCall:FuncType;
function HookProc(Code:integer;wParam:wparam;lParam:lparam):LRESULT;stdcall;begin
if(wParam=WM_LBUTTONDOWN)then
begin
MessageBeep(MB_ICONASTERISK);
FunCall();
end;
Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);end;function RegHook(FunCallEx:longint):boolean;stdcall;
begin
Result:=false;
if ishooked then
exit;
FunCall:=FuncType(FunCallEx);
Desktopwin:=GetDesktopWindow;
HookHandle:=SetWindowsHookEx(WH_MOUSE,HookProc,HInstance,0);
Result:=HookHandle<>0;
end;function RemoveHook:boolean;stdcall;
begin
Result:=false;
if(not IsHooked)and(HookHandle<>0)then
Result:=UnhookWindowsHookEx(HookHandle);
IsHooked:=false;
end;exports
RegHook,RemoveHook,HookProc;
begin
IsHooked:=false
end.
===========================================================================
问题是:当VB调用DELPHI的DLL时,单击自己进程的窗体时,VB模块中的‘MyFun’可以执行,但执行两次!
当单击其它进程的窗体时‘MyFun’的代码就没有执行。求:如何点击任何进程中的窗体时‘MyFun’都运行一次?
--------------------------------------------------------------
如问题圆满解决,本贴以两百分结贴+再开一个两百分的贴给主要回复人!!!
Option ExplicitPrivate Declare Function RegHook Lib "SetMouseHook.dll" (ByVal hwnd As Long) As Boolean
Private Declare Function RemoveHook Lib "SetMouseHook.dll" () As BooleanPrivate Sub Command1_Click()
Text1.Text = CStr(RegHook(AddressOf MyFun))
End SubPrivate Sub Command2_Click()
Text1.Text = CStr(RemoveHook)
End Sub
------------------------------------------------------------------------
'VB Module_Code:
Option Explicit
Dim SY As LongPublic Function MyFun() As Long
SY = SY + 1
Main.Text2.Text = CStr(SY)
MyFun = True
End Function
------------------------------------------------------------------------
//Delphi_Code:
library MouseHook;uses
SysUtils,
WinTypes,
WinProcs,
Messages;{$R *.res}
type
FuncType = Function():longint;//Short;
var
IsHooked:boolean;
HookHandle:hhook;
DesktopWin:hwnd;
FunCall:FuncType;
function HookProc(Code:integer;wParam:wparam;lParam:lparam):LRESULT;stdcall;begin
if(wParam=WM_LBUTTONDOWN)then
begin
MessageBeep(MB_ICONASTERISK);
FunCall();
end;
Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);end;function RegHook(FunCallEx:longint):boolean;stdcall;
begin
Result:=false;
if ishooked then
exit;
FunCall:=FuncType(FunCallEx);
Desktopwin:=GetDesktopWindow;
HookHandle:=SetWindowsHookEx(WH_MOUSE,HookProc,HInstance,0);
Result:=HookHandle<>0;
end;function RemoveHook:boolean;stdcall;
begin
Result:=false;
if(not IsHooked)and(HookHandle<>0)then
Result:=UnhookWindowsHookEx(HookHandle);
IsHooked:=false;
end;exports
RegHook,RemoveHook,HookProc;
begin
IsHooked:=false
end.
===========================================================================
问题是:当VB调用DELPHI的DLL时,单击自己进程的窗体时,VB模块中的‘MyFun’可以执行,但执行两次!
当单击其它进程的窗体时‘MyFun’的代码就没有执行。求:如何点击任何进程中的窗体时‘MyFun’都运行一次?
--------------------------------------------------------------
如问题圆满解决,本贴以两百分结贴+再开一个两百分的贴给主要回复人!!!
begin
if(Code=HC_Action)then
if(wParam=WM_LBUTTONUP)then
begin
MessageBeep(MB_ICONASTERISK);
Sleep(500);
FunCall();
end;
Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;
第二个贴可以是D版的(两个一百分的贴)。
有没有什么方法可以让DLL调用VB中的函数啊?
就像EnumWindows一样,你给它函数的地址它来调用。
不过你的函数也要有4个参数。
Sleep(500);//这个挂起函数做什么啊?
FunCall();
高2G我指的是2-4G的共享空间和系统空间,低2G指的是0-2G的私有进程空间
to 楼主:可以Send/Post一个消息给vb的窗口,在vb里处理。好像只有9x的2G-3G内存空间是所有进程公用的。在NT里按照MSDN的说法2G-4G内存空间是系统保留空间。
function HookProc(Code:integer;wParam:wparam;lParam:lparam):LRESULT;stdcall;
begin
if icode < 0 then
begin
Result := CallNextHookEX(0,icode,wparam,lparam);
exit;
end;
result:=0;
if (wparam=WM_LBUTTONDOWN) then
begin
MessageBeep(MB_ICONASTERISK);
FunCall();
result:=1;
end;
end;
const
LBDOWN=WM_USER+WM_LBUTTONDOWN;
LBUP=WM_USER+WM_LBUTTONUP;
var
IsHooked:boolean;
HookHandle:hhook;
DesktopWin:hwnd;
hWndLong:longint;
function HookProc(Code:integer;wParam:wparam;lParam:lparam):LRESULT;stdcall;
var
cur:TPoint;
begin
if(Code=HC_Action)then
if(wParam=WM_LBUTTONUP)then
begin
MessageBeep(MB_ICONASTERISK);
GetCursorPos(Cur);
SendMessage(hWndLong,wParam,WindowFromPoint(Cur),lParam);
end;
if(Code=HC_Action)then
if(wParam=WM_LBUTTONDOWN)then
begin
MessageBeep(MB_ICONASTERISK);
GetCursorPos(Cur);
SendMessage(hWndLong,wParam,WindowFromPoint(Cur),lParam);
end; Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;
---------------------------------------------------------
Option Explicit
Public Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202Public Const LBDOWN = WM_USER + WM_LBUTTONDOWN
Public Const LBUP = WM_USER + WM_LBUTTONUPDim Str As String
Public WinProc As LongPublic Function MyFun(ByVal con As String, ByVal hwnd As Long) As Long
Str = con & "==" & hwnd
Main.Text2.Text = Str & vbCrLf & vbCrLf & Main.Text2.Text
MyFun = True
End FunctionPublic Sub SetSubClass(ByVal Wnd As Long)
On Error Resume Next
WinProc = GetWindowLong(Wnd, GWL_WNDPROC)
SetWindowLong Wnd, GWL_WNDPROC, AddressOf WndProc
End SubPublic Sub UnSubClass(ByVal Wnd As Long)
On Error Resume Next
SetWindowLong Wnd, GWL_WNDPROC, WinProc
WinProc = 0
End SubPublic Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
Select Case Msg
Case LBDOWN: Call MyFun("WM_LBUTTONDOWN", wParam)
Case LBUP: Call MyFun("WM_LBUTTONUP", wParam)
Else: WndProc = CallWindowProc(WinProc, hwnd, Msg, wParam, lParam)
End Select
End Function
========================================================
我现在用这个方法,就是VB的操作太多了,还要SUBCLASS。
不知为什么总非法退出了。
D版的贴子是:
http://community.csdn.net/Expert/topic/3296/3296224.xml?temp=.4829523
下一个贴子明天贴出!
本贴晚几日结,再说说这个问题。
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long