请教高手,如何截获输入法输入的文字并改变
小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我的目的是将输出的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)); // 注意了,这处是关键[color=#FF0000] s:='哇咔咔'; ImmSetCompositionString(hIM, SCS_SETSTR,PChar(s),Length(s),nil,0);[/color] 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;beginend.