小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我的目的是将输出的Unicode文字转换为Big5编码来在台服某些游戏中用来着)。截获很简单,但试图改变时候发现通过系统的输入法API无论如何改变不了。
而这个似乎是ImmSetCompositionString的函数竟然软硬不吃,实属头疼。与之对应的ImmGetCompositionString却一路风雨无阻……特此求解。代码不长,一个主程序一个DLL全局钩子模块,用Delphi+KOL写的,KOL部分可以无视。
library HookDLL;uses
  Windows, Messages, KOL, imm;var
  oldHook: DWORD;
  FEdit:THandle;function CallWndProc(nCode: Integer; wParam: wParam; LParam: LParam): LRESULT; stdcall;
var hIM:hIMC;
    lpstr:array[0..128] of char;
    s:string;
begin
  Result := CallNextHookEx(oldHook, nCode, wParam, LParam);
  if PCWPStruct(LParam).message = WM_IME_COMPOSITION then begin
    hIM := ImmGetContext(PCWPStruct(LParam).hwnd);
    fillchar(lpstr,sizeof(lpstr),0);
    ImmGetCompositionString(hIM, GCS_RESULTSTR, @lpstr, sizeof(lpstr));
    // 注意了,这处是关键
    s:='哇咔咔';
    ImmSetCompositionString(hIM, SCS_SETSTR,PChar(s),Length(s),nil,0);

    ImmReleaseContext(PCWPStruct(LParam).hwnd, hIM);
    //用作反馈信息给我的RichEdit的。。
    SendMessage(FEdit,WM_SETTEXT,0,Integer(@lpstr));
  end;
end;procedure HookOn(Edit:THandle);
begin
  FEdit:=Edit;
  oldHook := SetWindowsHookEx(WH_CALLWNDPROC , @CallWndProc, HInstance, 0);
end;procedure HookOff();
begin
  UnHookWindowsHookEx(oldHook);
end;exports HookOn, HookOff;begin
end.