取得中英文输入字符串 ( 积分: 0 )

  • 主题发起人 主题发起人 zqssoft
  • 开始时间 开始时间
Z

zqssoft

Unregistered / Unconfirmed
GUEST, unregistred user!
想做个截取中英文输入法输入汉字的程序,然后,取得当前输入的汉字显示在自己的程序memo中。即可以截取Word,写字板,记事本,QQ,MSN等程序中的当前输入字符串。
在网上搜索了一些资料,仍然没有头绪。现在给出具体搜索结果,请大侠指点如何编写
相关消息处理DLL,还有如何在工程中加截应用等。谢谢。、

如何截获中文输入?
楼主fangjx(烟雨缥缈)2003-12-06 09:11:30 在 Delphi / Windows SDK/API 提问
我用钩子函数截获输入,但只能截获英文和部分中文输入,象WORD/WPS等软件中的中文输入就无法截获,请问WORD/WPS中中文输入发送的消息是什么?如何截获所有中文输入? 问题点数:20、回复次数:6Top
1 楼yansea(思宏)回复于 2003-12-07 17:49:17 得分 0
WM_IME_COMPOSITION:
begin
HIMC := ImmGetContext(MSG(Pmss^).hwnd);
if HIMC = 0 then Exit;
dwBufLen := ImmGetCompositionString(HIMC,GCS_RESULTSTR,nil,0);
if dwBufLen > 0 then
begin
GetMem(pBuf, dwBufLen + 1);
if ImmGetCompositionString(HIMC, GCS_RESULTSTR, pBuf, dwBufLen) > 0 then
begin
//你自己处理
end;
FreeMem(pBuf, dwBufLen + 1);
end;
ImmReleaseContext(MSG(Pmss^).hwnd, HIMC);
end;Top
2 楼yansea(思宏)回复于 2003-12-07 17:50:53 得分 0
pBuf 中即中文信息。Top
3 楼fangjx(烟雨缥缈)回复于 2003-12-08 08:00:07 得分 0
我用在DLL使用系统钩子截获WM_IME_COMPOSTIOM,但好像截获不到阿。
能给出全部代码吗?感谢阿!Top
4 楼yansea(思宏)回复于 2003-12-08 13:02:41 得分 0
我只是用了一个消息钩子,可以拦截到。现在用别人的机器上网,等有时间给你代码。Top
5 楼yansea(思宏)回复于 2003-12-08 17:59:11 得分 20
function Keyboardhook(iCode:Integer;wParam:Longint; lParam:Longint):LongInt;stdcall;//export;
var
HIMC: HWND;
dwBufLen: DWORD;
pBuf : PChar;
Cd: PCOPYDATASTRUCT;
Pmss: Pointer;
begin
Result:=CallNextHookEx(hh,icode,wParam,lParam);
DWORD(Pmss) := lparam;
GetMem(cd,sizeof(TCOPYDATASTRUCT));
cd.dwData := 0;
//pBuf := nil;
case MSG(Pmss^).message of
WM_CHAR:
begin
......
end;
WM_IME_CHAR:
begin
......
end;
WM_IME_COMPOSITION:
begin
HIMC := ImmGetContext(MSG(Pmss^).hwnd);
if HIMC = 0 then Exit;
dwBufLen := ImmGetCompositionString(HIMC,GCS_RESULTSTR,nil,0);
if dwBufLen > 0 then
begin
GetMem(pBuf, dwBufLen + 1);
if ImmGetCompositionString(HIMC, GCS_RESULTSTR, pBuf, dwBufLen) > 0 then
begin
cd.lpData := pBuf;
cd.cbData := dwBufLen;
SendMessage(SendHWND,WM_COPYDATA,SendHWND,LongInt(cd));
end;
FreeMem(pBuf, dwBufLen + 1);
end;
ImmReleaseContext(MSG(Pmss^).hwnd, HIMC);
end;
end;
FreeMem(cd);
end;

我是用的WM_COPYDATA来传递拦截到的字符。Top



有谁知道在word中WM_IME_COMPOSITION消息的拦截方法,可以等到输入的中文字符,请指教。
uses imm;

var
i:integer;
p:pchar;


if uMsg = wm_ime_composition then
begin
hi:=ImmGetContext(WORDHWND);
if hI = 0 then Exit;
i:=ImmGetCompositionString(hi,GCS_RESULTSTR,nil,0);
getmem(p,i);
try
ImmGetCompositionString(hi,GCS_RESULTSTR,p,i);//p中就是输入的字符串,i使字符串长度。

dc:=getdc(0);
textout(dc,20,20,p,i);
releasedc(dc,0);
finally
freemem(p);
end;
ImmReleaseContext(WORDHWND,hi);
end;
 
期待大侠的出现,帮助小弟解决此问题.
 
求DLL文件代码,及工程Demo.exe相应代码,要求用工程Demo.exe连接Dll,用全局钩子在Demo.exe例程的Memo控件中动态取得显示当前输入发发送到Word,QQ,MSN,记事本,写字板等软件中的中英文字符串,谢谢。必要时,可出钱求Demo及dll代码。
 
俺自己搜索提供了这些处理word的例程。
谁能再给个全局Dll的例子,并配合上面的代码。
以实现在Word,QQ,记事本,写字板中取输入法当前输入的中英文字符啊。
俺愿意出100元钱做为报酬。
 
QQ的不好取啊 都又保护啊
大哥 是不是打算做坏事情啊
 
我也在做这个 加我Q 66054635
 
不是取QQ啊,是取输入法发送的汉字或英文啊。明白吗,大哥大位们,帮助一下我吧。
急,急,急。。。
 
再贴一段找到的停息,望大侠给予帮助:
var
HIC : HIMC;
Buffer : pchar;
BufferLen : DWORD;
begin
Result := '';
HIC := ImmGetContext(Form1.handle);
if hIC = 0 then Exit;
BufferLen := ImmGetCompositionString(hIC, GCS_RESULTSTR, nil, 0);
if BufferLen <= 0 then Exit;
GetMem(Buffer, BufferLen +1);
try
if ImmGetCompositionString(HIC, GCS_RESULTSTR, Buffer, BufferLen) > 0 then
begin
Result := StrLCopy(Buffer, Buffer, BufferLen);
end;
finally
FreeMem(Buffer, BufferLen +1);
ImmReleaseContext(Form1.handle, HIC);
end;
end;
 
后退
顶部