SetWindowsHookEx应该将HOOK过程专门写在一个独立的DLL中, 这样的话才能映射进每个进程
空间里面.
当你的鼠标进入另外的进程的窗口时, 进程上下文已经切换为相应的窗口, 这时候的ListBox
指向的将会是一些垃圾, 系统出错在所难免.
建议的做法是将这些信息写入共享文件映射视图, 而你的窗口过程定时读取这个文件映射视图, 
或者是向你的窗口发送消息, 让你的窗口来处理.
如果有什么问题搞不清楚, 请到水木清华BBS的Delphi版在进行询问.

解决方案 »

  1.   

    谢谢大侠相助!昨夜小弟奋战X小时,得下程序,死机现象消失!但又出现以下问题:
       鼠标一移出窗口,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');