加上输出
function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;export;

解决方案 »

  1.   

    我刚刚学delhpi,希望大家说的详细一点,最好有点代码,谢谢,分数一定会给的,而且不够再给!
     cxx1997(小网虫_L)重载怎么做呀?说明白一点,谢谢!
      

  2.   

    如果要截获消息,delphi中不用钩子很容易搞定。
        procedure WMNCPaint(var Msg : TWMNCPaint); message WM_Paint;
    这样就行了,
    如果你想用鼠标钩子,
    那请看看这个
    http://www.csdn.net/expert/topic/863/863265.xml?temp=.2376673
    我帖的第一帖
      

  3.   

    楼上的朋友,谢谢你的回答,键盘的全局钩子我知道怎么做,消息也能拦截,可是,当别的应用程序发送消息的时候,我希望我的程序能钩住该消息,我用
    SPY跟踪Notepad的WM_CLOSE Message,发现该参数是这样的,WM_CLOSE,0,0
    这就说明,nCode=WM_CLOSE,Wparam=0,Lparam=0(我想应该是这样的),但是,我的nCode就是不能获取该数值,你说怎么办?
      

  4.   

    忘记说明了,设置全局消息钩子我是这样做的,SetWindowsHookEx(WH_GETMESSAGE,@MyProc,HINSTANCE,0),没错吧?
      

  5.   

    你写的没有错,
    但你的myproc必须放在dll中,而你的写myproc的时候没有写export
    用下面的试试
    function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;export;
    其它的好象没有问题。
      

  6.   

    首先对于本进程的消息一定不要用钩子(太绝对了,但能不用则不用,既增加系统负担,又难以维护)
    拦截系统或者其他进程的消息一定要用全局钩子,此时需要把回调函数写在DLL里,我是用VC写不基于MFC的DLL,用DELPHI调用碰到很多问题,如果用DELPHI写DLL一般可能不会有什么大问题,你可以试试。我这个月都在研究钩子,写一个可以把别人的程序套到我的框架并增加某些功能的程序。
    (大家不要说我无耻,实在是外国编的程序太牛了,自己没这实力,只好给他装一个我的封面。绝对不会用在中国人开发的程序上。)
    有什么问题可以跟我讨论。我的qq是12033948,不太爱在线,你可以留话,我可以给你一些代码。哎,我提的问题
    http://www.csdn.net/Expert/TopicView1.asp?id=878757
    http://www.csdn.net/Expert/TopicView1.asp?id=876553
    http://www.csdn.net/Expert/TopicView1.asp?id=869955
    http://www.csdn.net/Expert/TopicView1.asp?id=874911
    都没人理,第一个我自己解决了,剩下的回避了
    看来用DELPHI的人只对数据库感兴趣,对WINDOWS编程都不熟
      

  7.   

    我的函数是放在dll中的,但是我引出的函数就两个,一个StartHook,另一个StopHook,然后在StartHook中写
    HookID=SetWindowsHookEx(WH_GETMESSAGE,@MyProc,HINSTANCE,0);
    而function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;stdcall;
    该函数没有引出,难道一定要加export吗?
      

  8.   

    MyProc没有引出,你在那里放着呢???
    如果没有引出,其它的线程怎么会访问???
      

  9.   

    我引出两个函数StartHook,StopHook,其中在StarHook中写HookID=SetWindowsHookEx(WH_GETMESSAGE,@MyProc,HINSTANCE,0);
    然后在单元内部写function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;stdcall;
      begin
        beep;
        if nCode=WM_CLOSE then
         showmessage('ok');
        Result:=CallNextHookEx(HookID,nCode,Wparam,Lparam);
      end;
    事实,当拦截键盘的时候,成功,而拦截系统消息的时候,其实消息也经过这里了,因为我在里面加了Beep,结果证明消息经过这里,但是就是不能得到消息的结果,列如WM_CLOSE!
      

  10.   

    我觉得MyProc必须输出,否则其它进程没有办法调用,至于消息经过这里却没有wm_close,我没有作过,也不清楚,
    得有时间了,测试一下在说吧,呵呵!!!
      

  11.   

    我不清楚你的代码,看看hook类型用wh_callwndproc看看。
    或者你换个消息试试,比如说wm-paint或这wm-size,看是都拦截不到还是只有close不行。
    也可以发送自己定义的消息。
    先得到问题的全部状况再想办法。
      

  12.   

    function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;stdcall;
    nCode永远为0,Wparam和Lparam时常会变,我想,nCode一定是消息,但是怎么得到呢?
      

  13.   

    WH_GETMESSAGE hook:
    呼叫getmessage或peekmessage的那个线程就是执行wh-getmessage filter function的执行线程。
    其中参数和返回值:
    nCode        wParam         lParam        lResult
    HC_ACTION     NULL       指向一个msg结构  未使用,返回0看到了吗,lparam才是消息 !!!
      

  14.   

    WH_GETMESSAGE hook:
    呼叫getmessage或peekmessage的那个线程就是执行wh-getmessage filter function的执行线程。
    其中参数和返回值:
    nCode        wParam         lParam        lResult
    HC_ACTION     NULL       指向一个msg结构  未使用,返回0看到了吗,lparam才是消息 !!!
      

  15.   

    这么说吧,我在DLL中钩住记事本的所有消息,然后在自己的函数中检测有没有WM_CLOSE消息,但是,nCode永远=0,但是消息却经过了,因为我插入了beep测试。
    用SPY测试,当我直接关闭记事本的时候,消息是这样的:
    nCode             wParam           lParam             lResult
    WM_CLOSE          00000000         00000000           00000000但是当我向记事本用程序发送WM_CLOSE消息的时候,消息是这样的:
    nCode             wParam           lParam             lResult
    WM_CLOSE          00000000         0012F450           00000000我看帮助,lParam是Msg结构
    但是我的函数是这样写的
    function MyProc(nCode:integer;Wparam:integer;Lparam:integer);integer;stdcall
    不知道是不是正确,不过,我想应该是对的,如果不对,是不是可以这样写?
    function MyProc(nCode:integer;Wparam:integer;Lparam:msg);integer;stdcall
      

  16.   

    你看看这么可不可以;
    if PMessage(lParam)^.Msg = wm_close then
      ............
      

  17.   

    你看看这么可不可以;
    if PMessage(lParam)^.Msg = wm_close then
      ............
      

  18.   

    yansea(思宏) 谢谢你热心帮助,但是还是不行呀,我仔细看了DELHPI HELP
    然后把自己的函数改成以下形式了:
    function MyProc(nCode:integer;wParam:wParam;lParam:pointer):LRESULT;stdcall;export;
     var MyMsg:^Msg;
      begin
        MyMsg:=lParam;
        if MyMsg.message =WM_CLOSE then
          showmessage('ok');
        Result:=0;
        //Result:=CallNextHookEx(HOOKID,nCode,Wparam,Lparam);
      end;
      

  19.   

    nCode是检测是否存在其他的钩子的if nCode < 0 then //存在其他的钩子消息用WParam来判断也就是回调函数中的第2个参数if WParam = WM_Close then
      

  20.   

    function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; 
    var 
     pcs:TMSG; 
    begin 
     pcs:=TMSG(PMSG(lParam)^); 
     if nCode>=0 then 
     begin 
       if pcs.message=wm_lbuttonup then 
       ...........
     end; 
     Result:=CallNextHookEx(0,nCode,wParam,lParam); 
    end; 
    //比对一下这个看看,或者到
    http://ewaysoft.myrice.com/Dtext/delphi703.htm自己看看;
      

  21.   

    yansea(思宏):非常感谢!!!
    我重新测试一下,发现,代码一点问题都没有,消息能拦截WM_LBUTTONDBLCLK,WM_MOUSEMOVE,WM_KEYDOWN等消息,但是如果是WM_CLOSE,就不能收到,我用的系统是XP/Delphi,没有问题吧?不过我敢肯定,一定是没有找到真正解决的方案!现在我最需要的就是拦截WM_CLOSE!
      

  22.   

    哥们,那我劝你用WH_CALLWNDPROC试试,能保证所有调用窗口过程的消息都被拦截。
      

  23.   

    哥们,好好看看DELPHI的帮助你就会发现:
    GETMESSAGE只能监视用POSTMESSAGE发给窗口的消息,
    主要是键盘鼠标和一些排队的消息,
    而WM_CLOSE是用SENDMESSAGE发给窗体的,所以你用错了钩子。
    楼上的兄弟说的对,用CALLWNDPROC或CALLWNDPROCRET都可以拦到WM_CLOSE。
    但是同样的,用这两个钩子只能拦SENDMESSAGE发的消息,所以别想用他们拦键盘鼠标消息。
    所以你会发现VC的SPY++挂了3个钩子,就分别是以上