目前已经可以hook到按键,但是按键信息室重复的,估计是 KeyDown 和 KeyUp的原因,
请教一下,该如何判别 UP和DOWN,来只取一次?
问题2:hook 了 按键 1 (键值为97),该怎么向消息队列发送 2(键值为98)的信息,来实现改建的功能?

解决方案 »

  1.   


    //
    unction KeyBoardProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
    var
      msg:^TMsg;
    begin
      try
        if code < 0 then
        begin
          Result := CallNextHookEx(HooksData[WH_KEYBOARD].hhk, code, wparam, lparam);
          exit;
        end;
        if code = HC_ACTION  then
        begin
          msg := @lparam;   //判断up 和down ,可是这么操作有错
          if  msg.message = WM_KEYDOWN then 
          begin
            if HooksData[WH_KEYBOARD].Installed then          //设定好键值
            begin
              if wparam = HooksData[WH_KEYBOARD].key1 then
              begin
                //替换按键信息?不知道怎么操作
                MessageDlg(inttostr(HooksData[WH_KEYBOARD].key2), mtError, [mbOk], 0);
              end;
            end
            else
            begin
              KEY[Num]:=wparam;
              inc(num);
            end;
          end;
        end;
        Result := CallNextHookEx(HooksData[WH_KEYBOARD].hhk, code, wparam, lparam);
      except
        on E: Exception do
        begin
          Result := CallNextHookEx(HooksData[WH_KEYBOARD].hhk, code, wparam, lparam);
          MessageDlg('Error in ''HookDll.dll''', mtError, [mbOk], 0);
        end;
      end;
    end;
      

  2.   

    现在唯一的问题就是 该如何去替换按键消息
    盼复~//在HookInstall函数中
     HooksData[WH_KEYBOARD].hhk := SetWindowsHookEx(WH_KEYBOARD, @KeyBoardProc, Hinstance,0);//KeyBoardProc
    function KeyBoardProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
    begin
      try
        if code < 0 then
        begin
          Result := CallNextHookEx(HooksData[WH_KEYBOARD].hhk, code, wparam, lparam);
          exit;
        end;
        if code = HC_ACTION  then
        begin
    //      if ((lParam shr 31) and 1)=1   // 'KeyUp';
          if ((lParam shr 30) and 1)<>1 then  // 'KeyDown';
          begin
            if HooksData[WH_KEYBOARD].Installed then         
             begin
              if wparam = HooksData[WH_KEYBOARD].key1 then
              begin
                wparam := HooksData[WH_KEYBOARD].key2;             //如何去替换?
                MessageDlg(inttostr(HooksData[WH_KEYBOARD].key2), mtinformation, [mbOk], 0);
              end;
            end
            else
            begin
              KEY[Num] := wparam;
              inc(num);
            end;
          end;
        end;
        Result := CallNextHookEx(HooksData[WH_KEYBOARD].hhk, code, wparam, lparam);
      except
        on E: Exception do
        begin
          Result := CallNextHookEx(HooksData[WH_KEYBOARD].hhk, code, wparam, lparam);
          MessageDlg('Error in ''HookDll.dll''', mtError, [mbOk], 0);
        end;
      end;
    end;
      

  3.   

    HooksData[WH_KEYBOARD].hhk := SetWindowsHookEx(WH_GETMESSAGE, @KeyBoardProc, Hinstance,0);改成 WH_GETMESSAGE ,还是不行
      

  4.   

    全局钩子也行,最好是对指定程序的键盘hook改键
      

  5.   

    你自己找下 这个结构 这是 键盘消息的结构
    KeyHookStruct = record { WinUser.h, Line 926 }
        vkCode: DWord;
        scanCode: DWord;
        flags: DWord;
        time: DWord;
        dwExtraInfo: ULong;
      end;
    简单的就是
    if(wparam.vkCode=97)then wparam.vkCode:=98;需要增加的就是  把 wparam进行类型转换 呵呵