scan codes klawiatury

0

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

0

poszukaj w pomocy.
Klikasz Help -> Windows SDK, szukasz tematu 'virtual key codes' - tam chyba jest to czego chyba szukasz.

0

Chyba w glownym helpie delphi a nie w sdk

0

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

0

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

0

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...

0

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

0

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....

0

var
b:bye;
begin
asm
IN AL, 60h
MOV b, AL
end;
end;

i w b masz scancode

0

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...

0

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.)

0

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

0

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ę.

0

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;
0

no ja sprawdzałem na XP :/

0

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---- :-) :-) :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1