不使用Inherited;
或者不调用原有的消息处理事件

解决方案 »

  1.   

    我并没有使用Inherited;呀,我是这么处理的
    if MyMsg.Message=WM_CLOSE then
     begin
      showmessage('ok');
      exit;
     end;
    Result:=callnexthookex(......);
    我用的是dll钩子
      

  2.   

    if Msg.LParam=WM_CLOSE then
    inherited;
      

  3.   

    if Msg.LParam=WM_CLOSE then
    inherited;
      

  4.   

    function MyProc(nCode:longint;wParam:longint;Lparam:longint):longint;stdcall;export;
      begin
        if ... then
          begin
            showmessage('ok');
            exit;
          end;
        Result:=CallNextHookEx(HookId,nCode,wParam,lParam);
      end;一切都对,不过MSDN中好象说该消息能拦截,但不能阻止继续传递,不知道怎么解决?
      

  5.   

    用if Msg.LParam=WM_CLOSE then
    inherited;
    inherited好象是如果不想吃掉该消息就加入该语句吧?管用吗?
      

  6.   

    你在处理了消息之后,用GetMessage或PeekMessage把那条消息给他取走就可以了。
    function MyProc(nCode:longint;wParam:longint;Lparam:longint):longint;stdcall;export;
      begin
        if ... then
          begin
            showmessage('ok');
            GetMessage(...//注意这里
            exit;
          end;
        Result:=CallNextHookEx(HookId,nCode,wParam,lParam);
      end;我还是不明白你的
    if MyMsg.Message=WM_CLOSE then
    里面mymsg是从那里来的???
      

  7.   

    哦,我的MyMsg只指向Msg的指针
    var MyMsg:^MSG;
      这么说用GetMessage把消息取走就可以了?测试成功一定给分!非常感谢!
      

  8.   

    谢谢上面两位朋友参与,我手头现在没有delphi,所以没办法测试,等星期一(明天休息,想玩去@_@)测试成功,一定给两位加分,谢谢!!!
      

  9.   

    nCode:longint;wParam:longint;Lparam:longint
    怎么上面这三个钩子参数得到是不是wm_close;
    你用的 mymsg(var MyMsg:^MSG)那mymsg是怎么得到当前的消息的呢,
    请教,谢谢!!!
      

  10.   

    不行呀,GetMessage只能拦截WH_GETMESSAGE消息,却不能拦截WH_CALLWNDPROC钩子呀!
      

  11.   

    给定返回值。
    result := 1;
    若是得到了就不再调用callnexthookex
      

  12.   

    result := 1; 对了!干吗用Exit啊!我还没有见过!
      

  13.   

    result := 1; 对了!干吗用Exit啊!
      

  14.   

    一个例子:利用HOOK建立鼠标增强程序在Windows系统中提供了一种系统消息挂钩的(Message hook)功能,使用消息挂钩,可以实时监视处理系统中的各种消息。很多鼠标增强软件就是利用消息挂钩来拦截所有的鼠标消息进行处理的。
    要设置鼠标消息挂钩,一般先建立一个使用鼠标消息挂钩的动态连接库(DLL)文件,然后就可以在其它程序中使用这个DLL文件处理鼠标消息。
    下面的程序介绍通过鼠标消息挂钩监视鼠标消息,从而实现类似于一些鼠标增强软件一样的使窗口上下左右滚动的功能。1.建立动态连接库
    选择菜单 File|New ,选择DLL产生一个DLL模版,保存为 MHook.Dpr
    //MHook.Dpr源程序
    library MHook;uses
    SysUtils,
    Classes,
    hkproc in 'hkproc.pas';exports
    EnableMouseHook,
    DisableMouseHook;begin
    hNextHookProc:=0;
    procSaveExit:=ExitProc;
    ExitProc:=@HotKeyHookExit;
    end.再选择菜单 File|New ,选择Unit建立一个Pas文件,保存为 HKProc.pas
    //HKProc.pas源程序
    unit hkproc;interface
    uses
    Windows,Messages;
    const
    Move_Up = 0;Move_Down=1;
    Move_Left=2;
    Move_Right=3;
    var
    hNextHookProc:HHook;
    procSaveExit:Pointer;
    M_Direct:Integer;
    LPoint:TPoint;
    NowWindow:Integer;function MouseProc(iCode:Integer;wParam:WPARAM;
    lParam:Pointer):LRESULT; stdcall;export;
    function EnableMouseHook(WndHandle:integer):BOOL;export;function DisableMouseHook:BOOL;export;
    function GetDirect(FPoint : TPoint;LPoint : TPoint):integer;
    procedure HotKeyHookExit;far; implementation//GetDirect函数根据光标的移动决定窗口滚动的方向。
    function GetDirect(FPoint : TPoint;LPoint : TPoint):integer;
    var
    iWidth,iHeight:integer;
    begin
    iWidth:=LPoint.x-FPoint.x;
    iHeight:=lPoint.y-FPoint.y;
    Result:=-1;if ((iWidth=0)or(iHeight=0))then
    exit;if ((abs(iWidth) div abs(iHeight))>=2) then
    if iWidth<0 then //Move to left
    Result:=Move_Left
    else
    Result:=Move_Rightelse if ((abs(iHeight) div abs(iWidth))>=2) then
    if iHeight<0 then //Move to top
    Result:=Move_Up
    else
    Result:=Move_Down;end;function MouseProc(iCode:Integer;wParam:WPARAM;
    lParam:Pointer):LRESULT; stdcall;export;
    var
    pMouse:^MOUSEHOOKSTRUCT;
    l:integer;
    begin
    //如果用户按下鼠标右键同时Scroll Lock键为按下状态则
    //滚动窗口。
    if ((wParam=WM_RBUTTONDOWN) and Boolean(GetKeyState(145))) then
    begin
    pMouse:=lParam;
    l:=GetDirect(lPoint,pMouse.pt);
    if l>=0 then
    M_Direct:=l;
    lPoint:=pMouse.pt;NowWindow:=WindowFromPoint(lPoint);
    if M_Direct=Move_Up then
    SendMessage(NowWindow,WM_VSCROLL,SB_PAGEUP,0)
    else if M_Direct=Move_Down thenSendMessage(NowWindow,WM_VSCROLL,SB_PAGEDOWN,0)
    else if M_Direct=Move_Left then
    SendMessage(NowWindow,WM_HSCROLL,SB_PAGELEFT,0)
    else if M_Direct=Move_Right then
    SendMessage(NowWindow,WM_HSCROLL,SB_PAGERIGHT,0);
    Result:=1;
    exit;
    end
    else if ((wParam=WM_RBUTTONUP) and Boolean(GetKeyState(145))) then
    Result:=1
    else
    begin
    Result:=0;
    if iCode<0 then
    begin
    Result:=CallNextHookEx(hNextHookProc,iCode,wParam,
    integer(lParam));
    Exit;
    end;
    end;
    end;function EnableMouseHook(WndHandle:integer):BOOL;export;
    begin
    GetCursorPos(lPoint);
    Result:=False;
    if hNextHookProc<>0 then
    exit;
    //设置Mouse hook
    hNextHookProc:=SetWindowsHookEx(WH_MOUSE,@MouseProc,
    Hinstance,0);
    Result:=hNextHookProc<>0;
    end;function DisableMouseHook:BOOL;export;
    begin
    if hNextHookProc<>0 then
    begin
    UnHookWindowsHookEx(hNextHookProc);
    hNextHookProc:=0;
    end;
    Result:=hNextHookProc=0;
    end;procedure HotKeyHookExit;
    begin
    if hNextHookProc<>0 then
    DisableMouseHook;
    ExitProc:=procSaveExit;
    end;end.
    在菜单中选择 Project|Build MHook建立DLL文件。2.建立程序调用动态连接库
    在这里我们还是使用Delphi建立程序,当然也可以使用诸如VB等调用动态连接库。
    在菜单中选 File|New Application建立一个新程序,将工程文件保存为Project1.dpr//project1的源程序
    program Project1;uses
    Forms,
    Sample1 in 'Sample1.pas' {Form1};{$R *.RES}begin
    Application.Initialize;
    //隐藏窗口
    Application.ShowMainForm := False;Application.CreateForm(TForm1, Form1);
    Application.Run;
    end. 将Form1的源程序文件保存成Sample1.pas//Form1的源程序
    unit Sample1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, Menus, ImgList,ShellApi, ExtCtrls;const
    WM_ICONMESSAGE=WM_USER+$100;
    type
    TForm1 = class(TForm)procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    private
    procedure WMBarIcon(var Message:TMessage);message WM_ICONMESSAGE;publicend;function EnableMouseHook(WndHandle:integer):BOOL;external 'MHook.DLL';
    function DisableMouseHook:BOOL;external'MHook.DLL';var
    Form1: TForm1;implementation{$R *.DFM}
    procedure TForm1.WMBarIcon (var Message:TMessage);
    begin
    //用户双击任务栏图标则关闭程序 
    if Message.LParam = WM_LBUTTONDBLCLK then
    close;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
    lpData:PNotifyIconData;
    begin
    //删除任务栏图标
    lpData := new(PNotifyIconDataA);
    lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
    lpData.Wnd := Form1.Handle;
    lpData.hIcon := Form1.Icon.Handle;
    lpData.uCallbackMessage := WM_ICONMESSAGE;
    lpData.uID :=0;
    lpData.szTip := '鼠标演示';
    lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    Shell_NotifyIcon(NIM_DELETE,lpData);
    dispose(lpData);
    //解除Mouse hook
    DisableMouseHook;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
    lpData:PNotifyIconData;
    begin
    EnableMouseHook(Form1.Handle);
    Form1.Visible := False;
    lpData := new(PNotifyIconDataA);
    lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
    lpData.Wnd := Form1.Handle;
    lpData.hIcon := Form1.Icon.Handle;
    lpData.uCallbackMessage := WM_ICONMESSAGE;
    lpData.uID :=0;
    lpData.szTip := '鼠标演示';
    lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    Shell_NotifyIcon(NIM_ADD,lpData);
    dispose(lpData);
    end;end.运行程序,按下Scroll Lock键使其有效,将光标移动到文本窗口中(如IE、Word),移动鼠标,点击鼠标右键,窗口就可以依上一次移动的方向滚动。
    利用上面的原理,将程序做一些改动,就可以象专业的鼠标增强程序一样做出例如缩放窗口,运行程序等很多鼠标增强效果来。
      

  15.   

    我知道Result:=PM_REMOVE,但是,这只可以针对WH_GETMESSAGE钩子,而对于WH_CALLWNDPROC就不可以,当我尝试用Message:=PM_REMOVE的时候,记事本就非法操作关闭了,据MSDN说,这种钩子只可以钩到,但是不能阻止向下传递
      

  16.   

    是WH_GETMESSAGE沟字吗?如果是,那容易:  MSG *Msg = (MSG*)lParam;
     
      if(Msg->message == WM_CLOSE)
      { 
         .......
         Msg->message = WM_NULL ;//过滤掉原来的消息 
      }这个沟子通过返回值来控制没有作用,因为SDK已经说明了它必须返回0,当然也可以返回其它值,但没有作用。
      

  17.   

    哈哈,楼上的朋友,参与就是对我的支持,谢谢:)我用的是WM_CALLWNDPROC,所以用你说的方法不可以:)不过,非常感谢!
      

  18.   

    To: Shikari(最爱.NET) 
    不好意思,我作了测试,
    线程在处理这条消息的时候是把它取出来在去调用钩子的,
    所以我说的那种方法经过测试是行不通的,
    我取到的是WM_Mousemove消息,不是wm_close;而且也不能阻止窗口关闭,呵呵,不好意思。
    我在想想办法,有方法了告诉你。
      

  19.   

    TO: netlib(河外孤星) 
    非常感谢参与,如果我有了答案,也一定第一时间告诉你!:)谢谢!