由于特殊原因需要用到Delphi中的鼠标Hook,我在捕获到按钮单击时弹出DLL里的一个Form,但是当这个Form关闭之后,按钮事件似乎没有继续执行了,感觉是Message被杀掉了。我平时不怎么用Delphi,请问这是什么原因呢?应该怎么做呢?下面是大概的代码:
function MouseHook(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var btn:HWND;
begin
  if (wParam = WM_LBUTTONDOWN) and (IsMyApp <> 0) then
  begin
    if IsMyAppButton <> 0 then
    begin
    if PMOUSEHOOKSTRUCT(lParam)^.hwnd = IsMyAppButton then
    begin
      myForm1 := TmyForm1.Create(nil);
      myForm1.ShowModal;
      //MessageBeep(0);
    end;
    end;
  end;
  Result := CallNextHookEx(hook,iCode,wParam,lParam);//0;
end;上面代码中,    
myForm1 := TmyForm1.Create(nil);
myForm1.ShowModal;
窗口可以弹出来,但是被拦截的消息无法继续下去了。如果改成MessageBeep(0)就可以了。我的目的是要在用户单击按钮的时候弹出一个密码输入窗口。请高手帮助!谢谢!

解决方案 »

  1.   

    myForm1.ShowModal; 
    这个的问题吧,  
    if not ProcessMessage(Msg) then Idle(Msg);
      

  2.   

    不是被杀掉了,是被WM_LBUTTONDOWN拦截了。
      

  3.   

    请问,备拦截掉了之后,我应该怎样还原呢?让ButtonClick继续走下去?
      

  4.   

    反编译对我来说难度较高,水平还不够,况且,我认为Delphi也是可以实现的,只是不知道具体应该怎么做。
      

  5.   

    你窗体弹出来后,你点击按钮后不是窗体关闭了么,这个时候你应该处理这个窗体的消息,重新返回原来的消息接口。
    hook就是把A-->B改成A-->X-->B。
      

  6.   

    function MouseHook(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; 
    var btn        :HWND;
        NeedCreate :Boolean; 
    begin
      NeedCreate := False; 
      if (wParam = WM_LBUTTONDOWN) and (IsMyApp <> 0) then 
      begin 
        if IsMyAppButton <> 0 then 
        begin 
          if PMOUSEHOOKSTRUCT(lParam)^.hwnd = IsMyAppButton then
            NeedCreate := True; 
        end;        
      end; 
      Result := CallNextHookEx(hook,iCode,wParam,lParam);  if NeedCreate then
      begin
        myForm1 := TmyForm1.Create(nil); 
        myForm1.ShowModal;
      end; 
    end; 
      

  7.   

    对于鼠标钩子来说,可以不要DLL就可以实现。
      

  8.   


    这段代码我试试,请继续关注,我不知道关闭Modal窗口后,被拦截消息是否可以继续。试试先
      

  9.   

    用Modal来弹窗口的话,调用Modal窗口的代码会停在那等Modal窗口关闭才执行下一面的代码
    把  Result := CallNextHookEx(hook,iCode,wParam,lParam);//0; 写到函数的开始即可
      

  10.   

    一般WM_LBUTTONUP时才触发按钮点击事件
    你拦截的是WM_LBUTTONDOWN,此时弹出窗口的话,不会再触发WM_LBUTTONUP了,所以无法继续
    可以试试ShowModal后再往这个Button发个BM_CLICK消息