拦截中文和英文输入 ( 积分: 100 )

  • 主题发起人 主题发起人 暗夜中独舞
  • 开始时间 开始时间

暗夜中独舞

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个可以拦截到键盘中文和英文输入的程序
如果分开搞的话,可以搞定,但是现在合起来的话,就出现一点麻烦,下面这段程序只能拦截到中文输入法的输入,如果是美式键盘输入的话则搞不定。。。。。我现在想知道怎样做才能拦截到键盘的所有输入,包括中文和英文的!
还有,如果我弄两个键盘钩子(一个中文,一个英文),这样行不行呢?
{键盘钩子}
function KeyboardHookProc(iCode:Integer;WParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var
HIMC: HWND;
dwLen: DWORD;
cchar: array[0..20] of char;
begin
Result:= CallNextHookEx(KeyboardHook, iCode, wParam, lParam);
if (iCode = HC_ACTION) then
begin
if ((lParam shr 31) and 1)=1 then //KeyUp
begin
h := GetFocus();
HIMC := ImmGetContext(h);//先获取当前正在输入的窗口的输入法句柄
if HIMC = 0 then Exit;
dwLen := ImmGetCompositionString(HIMC,GCS_RESULTSTR,nil,0); //将ImmGetCompositionString的获取长度设为0来获取字符串大小.
if dwLen > 0 then
begin
if ImmGetCompositionString(HIMC, GCS_RESULTSTR, @cchar, dwLen) > 0 then // 再调用一次.ImmGetCompositionString获取字符串
begin
CopyMemory(@pShMem^.text,@cchar,dwLen);
sendMessage(pShMem^.hProcWnd, WM_CALLHOOK, 2, 0);
end;
end;
ImmReleaseContext(h, HIMC);
end;
end;
end;
 
为什么不拦 WM_IME_CHAR
 
中文占2个byte,其中第一的ord值大于$A1
 
to 白河愁,
可否说的详细点?
我拦截不到WM_IME_COMPOSITION 这个消息呀
代码如下:
pcs:=PCWPSTRUCT(lparam);
if PCs^.message = WM_IME_COMPOSITION then
beign
{}
end;
 
多人接受答案了。
 
后退
顶部