小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我的目的是将输出的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.
而这个似乎是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.
解决方案 »
- fastreport一个很怪异的问题
- dbediteh 怎么做到显出出来是这个值,而实际存储的却是另一个值?
- 太有才了!
- 请教F1Book如何插入图片?
- 关于MDI窗口的显示??
- 各位大侠,本人寻求一支持Delphi7的可对格式进行限制的文本框控件!!!在线给分!!
- 欢迎指教StringGrid的用法
- 用人用过TWinXP控件吗?为什么ListView报错啊?其它都正常。及...
- (在线等待。。。)如何实时返回程序启动经过的时间?好象有一个函数,有谁知道么,快来砸我!
- quickreport预览时死机怎么办?
- TRichEdit中如何加入其它控件
- 如何将调用的windows系统窗口在自己程序的panel里显示
很多输入法支持的(拼音和五笔)