例如Windows,记事本->帮助->关于记事本->Click事件。
请不要简单的说SetWindowsHookEx以及WH_CALLWNDPROC因为我试过很多办法,根本无法HOOK住菜单的点击事件,无法得到WM_COMMAND消息以及wParam传的菜单ID号。

解决方案 »

  1.   

    library MouseHook;uses
      Windows,Messages,ShareMem;{$R *.RES}Const
      HookHND : integer = 0;
      DescCaption : String = 'Form1';
      
    Function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
    var
      MouseHookStruct: ^TMOUSEHOOKSTRUCT;
    begin
      if nCode<0 then Result := CallNextHookEx(HookHND,nCode,WParam,LParam)
      else begin
        MouseHookStruct := Pointer(LParam);
    //这个MouseHookStruct.hwnd 就是当前的HWND了。
        Result := CallNextHookEx(HookHND,nCode,WParam,LParam);;
      end;
    end;Function OpenMouseHook(Caption:pchar) : Boolean; stdcall;
    begin
      if HookHND<>0 then Result := False
      else begin
        DescCaption := Caption;
        HookHND := SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
        Result := True;
      end;
    end;Procedure CloseMouseHook;Stdcall;
    begin
      if HookHND <> 0 then begin//如果有钩子就卸掉他。
        UnHookWindowsHookEx(HookHND);
        HookHND := 0;
      end;
    end;exports
      OpenMouseHook,CloseMouseHook;beginend.
      

  2.   

    上面的是个MOUSE全局钩子吧,和我说的没关系啊。
      

  3.   

    HookHND是个常量怎么可能不等于0呢?
      

  4.   

    我要Hook的是菜单啊,你怎么能给个Mouse呢?
      

  5.   

    自己已经发觉出答案,正确的HOOK住菜单应该用WH_GETMESSAGE