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;
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,还有如何在工程中加截应用等。谢谢。、
如何截获中文输入?
楼主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;
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;