我用钩子函数截获输入,但只能截获英文和部分中文输入,象WORD/WPS等软件中的中文输入就无法截获,请问WORD/WPS中中文输入发送的消息是什么?如何截获所有中文输入?

解决方案 »

  1.   

    WM_IME_COMPOSITION:
        begin
          HIMC := ImmGetContext(MSG(Pmss^).hwnd);
          if HIMC = 0 then Exit;
          dwBufLen := ImmGetCompositionString(HIMC,GCS_RESULTSTR,nil,0);
          if dwBufLen > 0 then
          begin
            GetMem(pBuf, dwBufLen + 1);
            if ImmGetCompositionString(HIMC, GCS_RESULTSTR, pBuf, dwBufLen) > 0 then
            begin
              //你自己处理
            end;
            FreeMem(pBuf, dwBufLen + 1);
          end;
          ImmReleaseContext(MSG(Pmss^).hwnd, HIMC);
        end;
      

  2.   

    我用在DLL使用系统钩子截获WM_IME_COMPOSTIOM,但好像截获不到阿。
    能给出全部代码吗?感谢阿!
      

  3.   

    function Keyboardhook(iCode:Integer;wParam:Longint; lParam:Longint):LongInt;stdcall;//export;
    var
      HIMC: HWND;
      dwBufLen: DWORD;
      pBuf : PChar;
      Cd: PCOPYDATASTRUCT;
      Pmss: Pointer;
    begin
      Result:=CallNextHookEx(hh,icode,wParam,lParam);
      DWORD(Pmss) := lparam;
      GetMem(cd,sizeof(TCOPYDATASTRUCT));
      cd.dwData := 0;
      //pBuf := nil;
      case MSG(Pmss^).message of
        WM_CHAR:
        begin
          ......
        end;
        WM_IME_CHAR:
        begin
          ...... 
        end;
        WM_IME_COMPOSITION:
        begin
          HIMC := ImmGetContext(MSG(Pmss^).hwnd);
          if HIMC = 0 then Exit;
          dwBufLen := ImmGetCompositionString(HIMC,GCS_RESULTSTR,nil,0);
          if dwBufLen > 0 then
          begin
            GetMem(pBuf, dwBufLen + 1);
            if ImmGetCompositionString(HIMC, GCS_RESULTSTR, pBuf, dwBufLen) > 0 then
            begin
              cd.lpData := pBuf;
              cd.cbData := dwBufLen;
              SendMessage(SendHWND,WM_COPYDATA,SendHWND,LongInt(cd));
            end;
            FreeMem(pBuf, dwBufLen + 1);
          end;
          ImmReleaseContext(MSG(Pmss^).hwnd, HIMC);
        end;
      end;
      FreeMem(cd);
    end;我是用的WM_COPYDATA来传递拦截到的字符。
      

  4.   

    我的程序可以了,原来是个笔误,哈哈。
    但问题有来了,在WPS里没有问题,但在WORD输入的中文会截获三次!晕~~
    最后还是很感谢您的热心帮助。