请问输入法调用什么API插入字符到当前程序焦点?急,顶者送分! ( 积分: 300 )

  • 主题发起人 主题发起人 dunbai
  • 开始时间 开始时间
D

dunbai

Unregistered / Unconfirmed
GUEST, unregistred user!
本人最近在开发一款小工具,需要实时将输入的某些字进行转换!
例如:我用智能ABC输入:你好
请问应该HOOK哪个API函数才可以得到“你好”2字并将其替换为“我们”并输出!
我自己HOOK了几个API都不行!我到现在也没搞清楚输入法是调用哪个API输出我们所打的字的! 请高手赐教!
 
SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance,0);

function GetMsgProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT;
var
theMsg: TMessage;
begin
Result := 0;
if Code < 0 then begin
Result := CallNextHookEx(HOOK, Code, WParam, LParam);
Exit;
end;
if Code = HC_ACTION then begin
if (PMsg(LParam).message = WM_IME_COMPOSITION) then begin
theMsg.Msg := PMsg(LParam).message;
theMsg.WParam := PMsg(LParam).wParam;
theMsg.LParam := PMsg(LParam).lParam;
Proc(theMsg);
end;
Result := CallNextHookEx(HOOK, Code, WParam, LParam);
end
end;

procedure Proc(var Message: TMessage);
var
hIMC: Integer;
dwSize: Integer;
hstr: Integer;
lpstr: Pointer;
begin
if Message.Msg = WM_IME_COMPOSITION then begin
if (Message.lParam and GCS_RESULTSTR) <> 0 then begin
hIMC := ImmGetContext(GetFocus);
dwSize := ImmGetCompositionString(hIMC, GCS_RESULTSTR, nil, 0);
dwSize := dwSize + sizeof(WCHAR);
hstr := GlobalAlloc(GHND,dwSize);
lpstr := GlobalLock(hstr);
ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);
ImmReleaseContext(GetFocus, hIMC);
SaveStrToFile(lpstr);//保存函数你自己写吧
end;
end;
end;
 
Hook消息WM_IME_COMPOSITION即可
 
这就是钩中文的原理!!
 
还有一招比较直接的就是钩API,
ImmGetCompositionString.如果第二个参数是GCS_RESULTSTR就表示输入法输入的文字要上屏了.你可以自己做变换处理.第三个参数是应用程序得到文字的缓冲区.
 
帮你顶一个,顺便发个交流群:
无论你是超极菜鸟,亦或是绝顶高手,在这里偶们静下心来平等地交流学习:
delphi交流群:4654765(delphi天堂)欢迎您的加入!让我们共同进步!!
加入者必须改名片为:{地点}+姓名 注:不改者勿扰!
 
帮你顶一个[:D]
 
to 暗夜中独舞:
不错!
这方面我没有遇到过!
 
我之前有根据网络上一些资料写过一个DEMO(可惜在家里的电脑里),可以拦截到所有的中文输入,但是如果是中英一起拦截的话就比较麻烦。因为当中文输入的时候也会被英文的钩子拦截到,还有一些特殊字符的处理也没有做,我还没做出比较好的解决方案。
不过网络上有一个C++版本的。
 
to:暗夜中独舞 你的代码,拦截不到任何数据,而且我要的是替换,不是拦截!谢谢!
我出1000人民币,看此帖:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3840589
 
楼主你说的替换规则说得不清楚
 
没想到,还是花了1000块。。。
 
后退
顶部