首页
社区
课程
招聘
[求助]神奇的钩子与输入法。。求解!
发表于: 2009-6-5 20:30 7380

[求助]神奇的钩子与输入法。。求解!

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.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主好想法~~~
2009-6-11 12:29
0
雪    币: 199
活跃值: (17)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
留名,待后人
2009-6-11 20:37
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错的想法,有时间解决它。
2009-6-12 16:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ine
5
跑来顶顶,貌似沉了。。
2009-6-18 00:07
0
雪    币: 160
活跃值: (272)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
楼主看看<寒江独钓>中介绍键盘的那部分,估计跟那个有点意思,就是程序做了限制,不可挂钩
2009-6-18 17:45
0
游客
登录 | 注册 方可回帖
返回
//