-
-
[求助]神奇的钩子与输入法。。求解!
-
发表于:
2009-6-5 20:30
7380
-
算来来到看雪也没发过几次贴。。一般都是单看,还不带批马甲的 - -
今天小弟有一疑问发帖求助,虽然不算软件安全,但好歹涉及钩子,想来也不会偏离太远,反正思路就是从各种各样的毛线中扯出来的……
好的,下面进入正题:
小弟我做一个程序截获输入法输入的东西,然后想要将其改变(其实我的目的是将输出的Unicode文字转换为Big5编码来在台服某些游戏中用来着)。截获很简单,但试图改变时候发现通过系统的输入法API无论如何改变不了。
而这个似乎是ImmSetCompositionString的函数竟然软硬不吃,实属头疼。与之对应的ImmGetCompositionString却一路风雨无阻……特此求解。
代码不长,一个主程序一个DLL全局钩子模块,用KOL+Delphi写的。
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);
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.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!