/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Checke i DOS-program om Winkey trykkes
Fra : John Kukkerig


Dato : 22-01-01 21:53

Hej

Er i gang med udvikle et dos-program.

Ønsker inde fra dette DOS-program, at kunne checke om Winkey-tasten trykkes,
evt i en tastekombination.

Er der nogen der kan hjælpe eller henvise til materiale på nettet ?

Programmet afvikles ikke i en DOS-session inde fra Windows.


Med venlig hilsen
John Kukkerig



 
 
Rasmus Christian Kaa~ (23-01-2001)
Kommentar
Fra : Rasmus Christian Kaa~


Dato : 23-01-01 07:54

> Ønsker inde fra dette DOS-program, at kunne checke om Winkey-tasten
trykkes,
> evt i en tastekombination.
> Programmet afvikles ikke i en DOS-session inde fra Windows.

har du set om du får nogen værdi tilbage fra getch() ?
- hvis ikke, så skal du ned og læse fra keyboard i/o porten, og det er lidt
mere tricky end getch()

-----
Rasmus Christian Kaae
www.daimi.au.dk/~kaae



N/A (23-01-2001)
Kommentar
Fra : N/A


Dato : 23-01-01 18:17



Thomas Jespersen (23-01-2001)
Kommentar
Fra : Thomas Jespersen


Dato : 23-01-01 18:17

"John Kukkerig" <jku@REMOVEkult.brock.dk> writes:

> Men vil være taknemlig hvis du eller en anden kan hjælpe selv efter den
> tricky metode, med at læse fra keyboardets i/o-port.

Den port du skal bruge er 0x60. Hvis jeg ikke husker forkert er
funktionen du skal bruge inp().

int scancode = inp(0x60);

Det skal lige siges at en keyboard scancode ikke er det samme som en
ASCII værdi. Den 7. bit fortæller hvorvidt tasten er trykket ned eller
den blev sluppet. Det er simpelt at teste

if (scancode & 0x80) {
// Den 7. bit et sat så knappen blev sluppet
}

Hvis du søger lidt med google.com kan du sikkert finde en tabel over
scankoder.


Ivan Johansen (23-01-2001)
Kommentar
Fra : Ivan Johansen


Dato : 23-01-01 21:57

John Kukkerig wrote:

> Er i gang med udvikle et dos-program.
> Ønsker inde fra dette DOS-program, at kunne checke om Winkey-tasten trykkes,
> evt i en tastekombination.

Jeg tror det nemmeste er at overtage interrupt 15. Hver gang en tast på
keyboardet trykkes ned eller slippes udstedes interrupt 15h med AH=4Fh. AL vil
indeholder en scan code fra keyboardet. For nogen taster kommer der to scan
koder, d.v.s. int 15h bliver udstedt to gange. Dette gælder bl.a. for de
specielle Windows taster. Når den venstre Windows tast trykkes ned kaldes int
15h med AH=4Fh og AL=E0h. Derefter kaldes int 15h med AL=5Bh.

Når tasten slippes udstedes int 15h igen, først med AL=E0h og derefter med
AL=DBh. Windows-tasterne giver følgende make- og break-koder:
Make Break
Venstre winkey: E0h 5Bh E0h DBh
Højre winkey: E0h 5Ch E0h DCh
Application-tast: E0h 5Dh E0h DDh

Nedenstående ses pseudo code for en interrupt 15h rutine.

bool Flag;

void Intterupt()
{
if(AH==0x4F)
{
if(AL==0xE0)
Flag=true;
else
{
if(Flag && (AL==0x5B || AL==0x5C)) //Check for en af windows-tasterne
{
// Kode her udføres når en af Windows-tasterne trykkes ned
}
Flag=false;
}
}
else
Call OldInt15;
}

Jeg håber det har hjulpet dig. Jeg er desværre ikke klar over hvordan man laver
interrupt rutiner i C, men det kan du nok slå op et sted.

Ivan Johansen


Rasmus Christian Kaa~ (24-01-2001)
Kommentar
Fra : Rasmus Christian Kaa~


Dato : 24-01-01 08:21

> Jeg tror det nemmeste er at overtage interrupt 15. Hver gang en tast på
> keyboardet trykkes ned eller slippes udstedes interrupt 15h med AH=4Fh. AL
vil
> indeholder en scan code fra keyboardet. For nogen taster kommer der to
scan
> koder, d.v.s. int 15h bliver udstedt to gange. Dette gælder bl.a. for de
> specielle Windows taster. Når den venstre Windows tast trykkes ned kaldes
int
> 15h med AH=4Fh og AL=E0h. Derefter kaldes int 15h med AL=5Bh.

det nemmeste er klart at læse fra port 0x60.

-----
Rasmus Christian Kaae
www.daimi.au.dk/~kaae





Ivan Johansen (24-01-2001)
Kommentar
Fra : Ivan Johansen


Dato : 24-01-01 11:14



Rasmus Christian Kaae wrote:
>
> det nemmeste er klart at læse fra port 0x60.

Det er for sin vis rigtig nok. Man er bare nødt til at lave en lykke der
hele tiden læser port 60h. Man skal også sikre sig at tasten ikke
slippes inden man når at læse port 60h. Det er lige netop derfor int 15h
AH=4Fh er lavet. Her kan man sætte et flag, så man ikke misser et
tastetryk.

Hvis vi skal være helt præcise modtages der også to scan codes på port
60h, når den venstre windows-tast trykkes ned. Først modtages E0h, og
når int 9 har svaret på den modtages 5Bh. Da venstre windows-tast er den
eneste der bruger 5Bh er det rigtigt at det er nok at reagere på denne.
Hvis du derimod vil kende forskel på de to Enter-taster er det ikke nok
at læse port 60h.

En anden ting er at output registeret på port 60h kun bør læses når bit
0 på status registeret, der findes på port 64h, er 1. Af disse grunde
bør keyboard controlleren kun tilgås fra int 9. Jeg vil derfor selv
altid bruge int 15h, men hvad i andre gør må i selvfølgelig selv om.

Ivan Johansen

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste