暗
暗夜中独舞
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;
如果分开搞的话,可以搞定,但是现在合起来的话,就出现一点麻烦,下面这段程序只能拦截到中文输入法的输入,如果是美式键盘输入的话则搞不定。。。。。我现在想知道怎样做才能拦截到键盘的所有输入,包括中文和英文的!
还有,如果我弄两个键盘钩子(一个中文,一个英文),这样行不行呢?
{键盘钩子}
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;