Czy ktos sie orientuje jak odczytac i zapisac do zmiennej scan code klawisza? nie chodzi o ASCI code oczywiscie tylko o scan code wysylany przez klawiature? czy jest jakas mozliwosc przeczytania go w delphi? czy musze robic tabele i przypozadkowywac do kodow ASCI scan cody???
prosze o pomoc!!!
dzieki i pozdrawiam
poszukaj w pomocy.
Klikasz Help -> Windows SDK, szukasz tematu 'virtual key codes' - tam chyba jest to czego chyba szukasz.
Chyba w glownym helpie delphi a nie w sdk
Kody klawiszy są zdecydowanie w SDK, bo to elementy charakterystyczne ogólnie dla Windowsa, nie dla samego Delphi.
//Ale w helpie do Delphi też są . EOT. pq
niestety chodzi mi o scan cody hardwareowe... znaczy nie te windowsowe virtual keys... chyba bedzie trzeba wstawke asemblerowa zrobic...
jesli ktos ma pojecie o przechwytywaniu kodow hardwareowych z klawiatury to bardzo prosze o kontakt i pomoc...
dzieki
niestety chodzi mi o scan cody hardwareowe...
Nie wiem jak jest z ich odczytywaniem, ale ich mapkę znajdziesz w książce "Anatomia PC" (wydanie 5) na stronie 730 :). Chętnie bym Ci zeskanował, ale nie mam czym...
ehh dzieki za pomoc... ale mam te scan cody w jakiejs ksiazce, elektronice praktycznej czy czyms takim...
coz chyba zrobie po prostu tabelke i bede zamienial kody ASCI... troche to bezsensowne ale inaczej nie umiem...
jesli ktos umie wyciagnac kody klawiatury (hardwareowe) z poziomu delphi (wstawka asm?) to prosze o pomoc
dzieki
pozdrawiam
kod z tej samej ksiazki w Turbo C (niestety pod DOS):
#include <dos.h>
#include <stdio.h>
#define IRQ1_OFF outp(0x21, 0x02)
#define IRQ1_ON outp(0x21, 0x00)
void buf_wyj(void);
void main(void)
{
unsigned char scan_code;
IRQ1_OFF; /* Zablokuj przerwania */
do
{
buf_wyj(); /* czekaj */
scan_code=inp(0x60); /* pobierz kod */
printf("\t%d", scan_code); /* wypisz go */
}
while(scan_code!=0x01); /*Nacisnieto ESC */
IRQ_ON; /* odblokuj przerwania */
}
void buf_wyj(void)
{
unsigned char rej_stanu
do
rej_stanu=inp(0x64); /* czekaj az bufor pusty */
while((rej_stanu & 0x01)!=0x01);
}
Ale coś mi sie nie widzi to wykonalne spod Windows....
var
b:bye;
begin
asm
IN AL, 60h
MOV b, AL
end;
end;
i w b masz scancode
no jakos to nie dziala... pewnie nie umiem tego zaimplementowac...
mozna w jakims przykladzie prosic? np. po wcisinieciu guzika czeka na wcisniecie klawisza, po wcisnieciu wurzuca na Label jego scan code?
please
ja zrobilem cos takiego:
[code]
procedure TForm1.scancode;
var
b:byte;
begin
asm
IN AL, 60h
MOV b, AL
end;
Label1.Caption:=format('scancode: %x',[b]);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.scancode;
end;
[/code]
i nie dziala... blad: priviliged instruction
sprawdzilem i wywala sie przy wykonywaniu IN AL, 60h...
bo tak jak podejrzewałem, to niemożliwe - z poziomu WIndows nie wolno odwoływać się do portów...
(błąd klasy EPriviledge:
EPrivilege is raised when an application tries to execute a processor instruction that is invalid for the current processor privilege level.)
dobra... to nie znacie sposobu zeby to zrobic <font color="white">wykozystujac </span><font color="red"> [ort!] </span>windowsy?... znaczy chyba OS juz moze sie do portow odwolywac?
no nic... jesli nie dacie rady mi pomoc to zrobie te cholerna tabele...
pozdrawiam
bo tak jak podejrzewałem, to niemożliwe - z poziomu WIndows nie wolno odwoływać się do portów...
Nawet w jednym FAQ dotyczącym Delphi było o tym jak używać portów w Delphi. Chyba, że masz Win XP, to tam tak łatwo nie jest.
Po prostu musisz kod wrzucić do jakiegoś timera, albo lepiej do hooka na klawiaturę.
W Win95/98 (moze tez Me) do portow mozna sie odwolywac normalnie przez asemblerowe instrukcje in i out. W NT i nastepcach (2000/XP) system nie dopuszcza do bezposredniego dostepu do portow sprzetowych. Istnieja komponenty, ktorymi mozna to przejsc.
PS. MapVirtualKey pozwala m.in. zamienic virtual key code na scan code. Szczegoly w Windows SDK.
np.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Label1.Caption:=IntToStr(MapVirtualKey(Key, 0));
end;
no ja sprawdzałem na XP :/
masz ty kod w Paszczaku (u mnie nie działa na XP ale 98 normalnie);
----cut----
program kod;uses crt;
var scan:byte;
procedure pobierz(var kod: byte);
var
help : byte;
begin
help := port[$64];
if ((help and 01) = 0) then
begin
kod := 0; exit;
end;
if ((help and 32) = 32) then
begin
help := port[$64];
kod := 0; exit;
end;
kod := port[$60];
end;
begin
port[$21] := $02;{zablokuj}
while (1 = 1) do
begin
pobierz(scan);
{ ESC?}
if (scan = 1) then break;
if (scan <> 0) then
writeln(scan);
end;
port[$21] := $00;{odblokuj}
end.
----cut---- :-) :-) :-)