请教高手,如何截获输入法输入的文字并改变

木落 2009-06-05 08:51:31
小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我的目的是将输出的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.
...全文
97 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hydonlee 2009-09-03
  • 打赏
  • 举报
回复
直接使用一个可以输出big5的输入法.
很多输入法支持的(拼音和五笔)
木落 2009-06-05
  • 打赏
  • 举报
回复
没人吗???

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧