我能在DELPHI 程序中 拦截 不是指向本程序窗体 WINDOWS消息吗? 多谢

解决方案 »

  1.   

    肯定可以,就是没做过,呵呵。
    大概要用到hook吧。
      

  2.   

    可以用SetWindowHookEx安装全局Hook.如WH_MOUSE..WH_KEYBOARD.等。
      

  3.   

    bluenightsky() 
    告诉我如何?能给段代码吗?
    多谢!
      

  4.   

    最简单的方法就是:
        点右上角的“搜索”,输入"钩子"按DELPHI大类搜索即有很多了。
    如:
      http://expert.csdn.net/Expert/topic/1569/1569791.xml?temp=.3465235
      

  5.   

    网上有很多例子的,你自己可以找找看。
    手头有个例子,不过不符合你的要求,看看吧
    --- Cut Here --- 
    library HKTest; uses 
    HKProc in 'HKProc.pas'; exports 
    EnableHotKeyHook, 
    DisableHotKeyHook; begin 
    hNextHookProc := 0; 
    procSaveExit := ExitProc; 
    ExitProc := @HotKeyHookExit; 
    end. 
    --- Cut Here --- 
    2. 将以下的文字剪贴存成 HKProc.PAS 
    (Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录) --- Cut Here --- 
    unit HKProc; interface uses 
    Windows, Messages; var 
    hNextHookProc: HHook; 
    procSaveExit: Pointer; function KeyboardHookHandler(iCode: Integer; 
    wParam: WPARAM; 
    lParam: LPARAM): LRESULT; stdcall; export; 
    function EnableHotKeyHook: BOOL; export; 
    function DisableHotKeyHook: BOOL; export; 
    procedure HotKeyHookExit; far; implementation function KeyboardHookHandler(iCode: Integer; 
    wParam: WPARAM; 
    lParam: LPARAM): LRESULT; stdcall; export; 
    const 
    _KeyPressMask = $80000000; 
    begin 
    Result := 0; 
    If iCode <  0 Then 
    begin 
    Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam); 
    Exit; 
    end; 
    // 侦测 Ctrl + B 组合键 
    if ((lParam and _KeyPressMask) = 0) and 
    (GetKeyState(vk_Control) <  0) and (wParam = Ord('B')) then 
    begin 
    Result := 1; 
    WinExec('Notepad.exe', sw_Normal); // 记事本 
    end; 
    end; function EnableHotKeyHook: BOOL; export; 
    begin 
    Result := False; 
    if hNextHookProc < >  0 then Exit; 
    // 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下 
    // 来, 免得 HOOK 呼叫链结断掉 
    hNextHookProc := SetWindowsHookEx(WH_KEYBOARD, 
    KeyboardHookHandler, 
    HInstance, 
    0); 
    Result := hNextHookProc < >  0; 
    end; function DisableHotKeyHook: BOOL; export; 
    begin 
    if hNextHookProc < >  0 then 
    begin 
    UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook 
    hNextHookProc := 0; 
    MessageBeep(0); 
    MessageBeep(0); 
    end; 
    Result := hNextHookProc = 0; 
    end; procedure HotKeyHookExit; 
    begin 
    // 如果忘了解除 HOOK, 自动代理解除的动作 
    if hNextHookProc < >  0 then DisableHotKeyHook; 
    ExitProc := procSaveExit; 
    end; end. 
    --- Cut Here --- 3. 启动 Delphi 2.0 4. 开启 HKTest.DPR, 然後 Project | Build All 以产生 HKTest.DLL 5. File | New Application 开启一个新的专案 6. 将此专案 unit1 与 project1 存档, 请注意: 请存到与 HKTest.DLL 
    相同的目录中. 7. 在 Form1 上安置二个 TButton, 并撰写 OnClick 程式, 同时, 
    在 implementation 节中宣告 EnableHotKeyHook() 与 
    DisableHotKeyHook(), 修改後的程式应类似: 
    ... 
    ... 
    implementation {$R *.DFM} function EnableHotKeyHook: BOOL; external 'HKTEST.DLL'; 
    function DisableHotKeyHook: BOOL; external 'HKTEST.DLL'; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    if EnableHotKeyHook then 
    ShowMessage('HotKey Testing...'); 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    begin 
    if DisableHotKeyHook then 
    ShowMessage('HotKey Testing..., DONE!!'); 
    end; end. 
      

  6.   

    钩子贼简单,你看看delphi帮助会很明白。
    查setwindowshookex
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      i:integer;
      HookHandle: HHOOK;
    implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
    begin
        if (Code = HC_ACTION) then
        if PMsg(Msg)^.Message = WM_mousemove  then    begin
             //showMessage('已经截获该消息');
            i:=i+1;
            form1.Caption:=inttostr(i);
        end;
        Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      i:=0;
      HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改
    //  HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);
    end;
    end.
    以上程序仅可以拦截本窗口的鼠标操作!!!!!
    高手请指教!!!
    谢谢
      

  8.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      i:integer;
      HookHandle: HHOOK;
    implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
    begin
        if (Code = HC_ACTION) then
        if PMsg(Msg)^.Message = WM_mousemove  then    begin
             //showMessage('已经截获该消息');
            i:=i+1;
            form1.Caption:=inttostr(i);
        end;
        Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      i:=0;
      HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改
    //  HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);
    end;
    end.
    以上程序仅可以拦截本窗口的鼠标操作!!!!!
    高手请指教!!!
    谢谢
      

  9.   

    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
      i:integer;
      HookHandle: HHOOK;
    implementation{$R *.DFM}
    function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
    begin
        if (Code = HC_ACTION) then
        if PMsg(Msg)^.Message = WM_mousemove  then    begin
             //showMessage('已经截获该消息');
            i:=i+1;
            form1.Caption:=inttostr(i);
        end;
        Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      i:=0;
      HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改
    //  HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);
    end;
    end.
    以上程序仅可以拦截本窗口的鼠标操作!!!!!
    高手请指教!!!
    谢谢
      

  10.   

    做成DLL就可以拦截其它窗口的操作了!!!!!不知我说的对不对,,呵呵
      

  11.   

    请做成DLL..
    系统级的HOOK只能用DLL