SetWindowsHookEx应该将HOOK过程专门写在一个独立的DLL中, 这样的话才能映射进每个进程
空间里面.
当你的鼠标进入另外的进程的窗口时, 进程上下文已经切换为相应的窗口, 这时候的ListBox
指向的将会是一些垃圾, 系统出错在所难免.
建议的做法是将这些信息写入共享文件映射视图, 而你的窗口过程定时读取这个文件映射视图,
或者是向你的窗口发送消息, 让你的窗口来处理.
如果有什么问题搞不清楚, 请到水木清华BBS的Delphi版在进行询问.
空间里面.
当你的鼠标进入另外的进程的窗口时, 进程上下文已经切换为相应的窗口, 这时候的ListBox
指向的将会是一些垃圾, 系统出错在所难免.
建议的做法是将这些信息写入共享文件映射视图, 而你的窗口过程定时读取这个文件映射视图,
或者是向你的窗口发送消息, 让你的窗口来处理.
如果有什么问题搞不清楚, 请到水木清华BBS的Delphi版在进行询问.
鼠标一移出窗口,MouseHookPlayBack 失效!!!
请大侠指点一二,多谢!
如果有相似的例子,烦请贴出来或Mail To [email protected]
我会开第二个问题一起给分,再次感谢! //DLL
library MouseHook;uses
SysUtils,
Classes,
Windows,
Messages,
Dialogs;var
HookHandle: hHook;
FHandle: THandle = 0;
WM_MyMsg: Longint;
FhInstance: HINST;{$R *.RES}function MouseHookPlayBack(nCode: Integer; wParam,lParam: Longint): Longint; stdcall;
begin
case nCode of
HC_ACTION:
begin
if (FHandle<>0) then
begin
PostMessage(FHandle,WM_MyMsg,0,0); //发送消息
end;
Result:= CallNextHookEx(HookHandle,nCode,wParam,lParam);
end;
else
Result:= CallNextHookEx(HookHandle,nCode,wParam,lParam);
end;
end;procedure BeginMouseHook; stdcall;
begin
HookHandle:= SetWindowsHookEx(wh_Mouse,MouseHookPlayBack,FhInstance,0);
end;procedure SetHandle(AHandle: THandle); stdcall;
begin
FHandle:= AHandle; //Get Main Application Handle
end;procedure SethInstance(AhInstance: HINST); stdcall;
begin
FhInstance:= AhInstance; //Get Main Application hInstance
end;procedure EndMouseHook; stdcall;
begin
UnHookWindowsHookEx(HookHandle); //Un Hook
end;exports
BeginMouseHook,
SetHandle,
SethInstance,
EndMouseHook;begin
WM_MyMsg:= RegisterWindowMessage('Zxw');end.//主程序procedure BeginMouseHook; stdcall; external 'MouseHook.dll';
procedure SetHandle(AHandle: THandle); stdcall; external 'MouseHook.dll';
procedure SethInstance(AhInstance: HINST); stdcall; external 'MouseHook.dll';
procedure EndMouseHook; stdcall; external 'MouseHook.dll';procedure TForm1.WndProc(var Message: TMessage);
begin
if Message.Msg=WM_MyMsg then
MessageBeep(0)
else
inherited WndProc(Message);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
SetHandle(Application.Handle);
SethInstance(hInstance);
BeginMouseHook;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
EndMouseHook;
end;initialization
WM_MyMsg:= RegisterWindowMessage('Zxw');