首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

,怎么截获输入法输入的文字并改变

2012-02-03 
请教高手,如何截获输入法输入的文字并改变小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我

请教高手,如何截获输入法输入的文字并改变
小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我的目的是将输出的Unicode文字转换为Big5编码来在台服某些游戏中用来着)。截获很简单,但试图改变时候发现通过系统的输入法API无论如何改变不了。
而这个似乎是ImmSetCompositionString的函数竟然软硬不吃,实属头疼。与之对应的ImmGetCompositionString却一路风雨无阻……特此求解。

代码不长,一个主程序一个DLL全局钩子模块,用Delphi+KOL写的,KOL部分可以无视。

Delphi(Pascal) code
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.


[解决办法]
直接使用一个可以输出big5的输入法.
很多输入法支持的(拼音和五笔)

热点排行