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