在DLL中,用SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, HInstance,  0);
做了一个全局钩子,另一个TForm里的消息处理函数wmKey()接收 KeyboardHookProc() postMessage 来的键盘消息,如果在TForm里按键,程序就会不停的在wmKey()里循环,只有结束任务。而在其它地方的按键是正常的。
如果KeyboardHookProc()改用sendMessage发消息,wmKey()倒是不会死循环了,但是退出程序后,刚才被捕捉按键的窗体就死锁了。

解决方案 »

  1.   

    function KeyboardHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall
    begin
    if iCode<0 then begin
    Result:=CallNextHookEx(khook, iCode, wParam, lParam);
    exit;
    end; pMapMem^.KeyCode := wParam;
    if lParam>0 then
    pMapMem^.MsgID:=pMapMem^.wmKeyDown
    else
    pMapMem^.MsgID:=pMapMem^.wmKeyUp;
    result := 0;
            
            //这样写的话,程序退出,被捕捉的程序就死了,但也不是每次都死
    sendMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
            //如果这样,主界面一旦有按键,就死循环了
            postMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
    ///////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.wmKeyDown(var msg: TMessage);
    begin
    memo1.lines.add(Char(msg.WParam));
    end;///////////////////////////////////////////////////////////////////////////////////////////////
      

  2.   

    重新贴:function KeyboardHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall
    begin
    if iCode<0 then begin
    Result:=CallNextHookEx(khook, iCode, wParam, lParam);
    exit;
    end; pMapMem^.KeyCode := wParam;
    if lParam>0 then
    pMapMem^.MsgID:=pMapMem^.wmKeyDown
    else
    pMapMem^.MsgID:=pMapMem^.wmKeyUp;
    result := 0;
            
            //这样写的话,程序退出,被捕捉的程序就死了,但也不是每次都死
    sendMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
            //如果这样,主界面一旦有按键,就死循环了
            postMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
    ///////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.wmKeyDown(var msg: TMessage);
    begin
    memo1.lines.add(Char(msg.WParam));
    end;///////////////////////////////////////////////////////////////////////////////////////////////