Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Tastatur tsten

Hallo,

ich suche ein Programm mit dem ich die Tasten einer Tastatur testen kann.

Ich würde sowas auch gerne selber mit C programmieren, aber ich weiß nicht wie. ???

Zahlen und Buchstaben wären jetzt nict das Problem.
Aber wie gebe ich aus ob nun STRG oder F4 gedrückt wird?


Antworten zu Tastatur tsten:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Guck mal hier:
http://www.daniweb.com/code/snippet497.html
Wobei da noch einige Scan-Codes fehlen und einige evtl. nicht auf jedem System/mit jeder Tastatur funktionieren.
Vielleicht gibts da noch was besseres in der Win API...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Okay...das ist schonmal sehr gut.

Aber F11 und F12 und so gehen irgendwie nicht :-(

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

...vermutlich, weil in dem Beispiel nur die Codes für F1-F10 definiert sind...
Bei mir funktionieren z.B. auch PgUp, PgDown nicht; du müsstest mal versuchen herauszufinden, welche Scan-Codes dein Rechner/deine Tastatur verwendet und das dann entsprechend anpassen.

« Letzte Änderung: 22.09.08, 14:56:21 von Lisaa »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich habe jetzt im Internet gesucht.

Ich habe auch eine Tabelle gefunden. Allerdings funktioniert die nicht.
Die Leerstaste wäre dann auch die neun


Stehen die Scancodes nicht in irgendeiner Treiber-Datei.
Beispielsweise für die Standard-Tastatur.

Oder kann man irgendwie die gesendeten Codes abfangen, bevor der Treiber sie in ASCII umwandelt.
 

« Letzte Änderung: 23.09.08, 09:15:25 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Also um herauszufinden welche Zahlen ich für welche Taste brauche habe ich das Programm umgeändert.

/* This program shows how to pick up the scan codes from a keyboard */

/* These define the scan codes(IBM) for the keys. All numbers are in decimal.*/
#define PAGE_UP     73
#define HOME        71
#define END         79
#define PAGE_DOWN   81
#define UP_ARROW    72
#define LEFT_ARROW  75
#define DOWN_ARROW  80
#define RIGHT_ARROW 77
#define F1          59
#define F2          60
#define F3          61
#define F4          62
#define F5          63
#define F6          64
#define F7          65
#define F8          66
#define F9          67
#define F10         68
#define F11         87
#define F12         217
#define Leertaste   32

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>


int main()
{
char KeyStroke;

printf( "Press Escape to quit.\n\n");

do
{
KeyStroke = getch();
printf("KeyStroke: ");
                                 
if (KeyStroke <= 0)
{
            printf("%c\t",KeyStroke);
printf("%i\t",KeyStroke);
printf("%X\t",KeyStroke);
KeyStroke = getch(); // Even though there are 2 getch() it reads one keystroke
      printf("%c\t",KeyStroke);
      printf("%i\t",KeyStroke);
      printf("%X\t",KeyStroke);
      switch (KeyStroke)
{
   
     

             
case PAGE_UP:
printf( "PAGE UP\n" );
break;
case PAGE_DOWN:
printf( "PAGE DOWN\n" );
break;
case HOME:
printf( "HOME\n" );
break;
case END:
printf( "END\n" );
break;
case UP_ARROW:
printf( "UP ARROW\n" );
break;
case DOWN_ARROW:
printf( "DOWN ARROW\n" );
break;
case LEFT_ARROW:
printf( "LEFT_ARROW\n" );
break;
case RIGHT_ARROW:
printf( "RIGHT_ARROW\n" );
break;
case F1:
printf( "F1\n" );
break;
case F2:
printf( "F2\n" );
break;
case F3:
printf( "F3\n" );
break;
case F4:
printf( "F4\n" );
break;
case F5:
printf( "F5\n" );
break;
case F6:
printf( "F6\n" );
break;
case F7:
printf( "F7\n" );
break;
case F8:
printf( "F8\n" );
break;
case F9:
printf( "F9\n" );
break;
case F10:
printf( "F10\n" );
break;
            case F11:
printf( "F11\n" );
break;
case F12:
printf( "F12\n" );
break;
default:
printf( "Some other key.\n" );
}
}
else
        {
printf("%c\t",KeyStroke);
printf("%i\t",KeyStroke);
printf("%X\t\n",KeyStroke);
        }
}
while (KeyStroke != 27); // 27 = Escape key
}


Was ich allerdings unglücklich finde, sind die negativen Zahlen die man nicht als negative Hex-Zhalen darstellen kann.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ja, gute Idee; da wäre ich jetzt nicht drauf gekommen...
Sind eigentlich ja nur F11 und F12, die so komische Codes haben oder?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nein....Einfg, Entf auch.

Bild auf und Bild ab auf dem Nummern-Feld gehen. Aber auf dem anderen Feld geben die auch komisch eCodes von sich.

Ist ganz interessant.  ;D

Jetzt muss ich nur noch herausfinden wie man CAPS,Shift, STRG und ALT herausfindet.


Edit:

Also ich habe ein schlaues Buch ;D Da sind die Tabellen drin.
Also für Das DOS-Fenster (Codesseite 850)
ist da Festgelegt:
Zeichen:   Dez:    Hex:
ó               224     E0

Die Hexzahl ist bei dem Programm für ó FFFFFFE0.
Also werden die Zeichen die nicht ASCII sind in der FOrm FFFFFFxx dargestellt. Das muss man ja auch wissen. ::)

« Letzte Änderung: 25.09.08, 08:26:08 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

So...das ganze geht auch mit Inline-Assembler.
Wie genau das funktioniert eiß ich nicht. Aber ich habe ein Beispiel-Programm, was nur rechnen soll, Aber ich kann es nciht kompilieren.

#include <stdio.h>


int quadrat(int);


int main(void){
     printf("\n Das Quadrat von 33 ist %i",quadrat(33));

int quadrat(int n){
     __asm{
          mov eax, n;
          mul eax;
          }
         
}

Angeblich ist vor der {-Klammer bei __asm ein Syntax Error. Das Programm muss aber eigneltich funktionieren. Hab es genau so abgeschrieben. :(

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

o.O Assembler... du weißt sicherlich, dass es viele verschiedene gibt und dass du natürlich die zu deinem Compiler passende Syntax nehmen musst?
Für den gcc (der in DevC++ verwendet wird) zum Beispiel diese (AT&T-Syntax):

#include <stdio.h>

int quadrat(int n){
     asm("movl %0, %%eax"::"a"(n));
     asm("mull %eax");
}

int main(void){
     printf("\n Das Quadrat von 33 ist %i",quadrat(33));
     getchar();
}

In deinem Beispiel fehlt außerdem noch die schließende Klammer für die main()...
« Letzte Änderung: 01.10.08, 20:19:08 von Lisaa »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Also die Klammer bringt nichts. ;D

Das es für jeden Compiler ne andere Syntax gibt, wusste ich nicht, aber für dass es unterscheide ei der Hardware gibt, wusste ich. Toll, dieses halbwissen ::)

Ach ja, Ich habe das Beispiel aus "C - Programmieren von Anfang an" von Horst Erlenkötter.

Das hätte er aber ruhig erwähnen können ;)

Also dein Programm funktioniert bei mir.
Sind die AT&T Befhele für AMD-Prozessoren?
ich hab anscheinend sowieso die falschen benutzt. Die sind für x86-Prozis  ::)
Also kann man Assembler nur benutzen, wenn man weiß wie das System aussieht.

« Letzte Änderung: 02.10.08, 07:58:08 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nein. Man muss unterscheiden zwischen Plattform und Syntax. Die Plattform ist die Hardware, z.B. x86-Prozessoren (zu denen auch alle AMDs und Intel-CPUs gehören, da lagst du also schonmal richtig). Sie bestimmt, welche Befehle, Register etc. zur Verfügung stehen. Die Syntax bestimmt, wie die Befehle aussehen. Die meisten Compiler nutzen die Intel-Syntax (das ist IIRC die, die du verwendet hast); einige verwenden aber die AT&T-Syntax (die die ich verwendet habe). Mit dem Intel-Compiler (oder z.B. MS Visual Studio) kannst du dein Programm übersetzen, mit dem gcc nicht.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Okay...nu hab ichs  verstanden  :)

Die AT&T Syntax sieht irgendwie komplizierter aus.
Aber ist wahrscheinlich nur gewöhnungssache.

asm("movl %0, %%eax"::"a"(n));
Kannst du mir das mal erklären?
Ich steig da nicht durch. Wozu ist "%0" da?
« Letzte Änderung: 02.10.08, 11:38:59 von Andre S. »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich habs mir auch nur aus dem Netz zusammengesucht...

%0 ist der erste Parameter für das movl, %%eax der zweite. Source und Destination sind nämlich genau andersrum als bei der Intel-Syntax.
%0 ist der 0. externe Parameter (hier das n), diese müssen später noch definiert werden.
Nach dem ersten Doppelpunkt stehen (externe) Output-Parameter, d.h. wenn du das Ergebnis wieder in einer Variable speichern willst, musst du die hier "deklarieren".
Nach dem zweiten Doppelpunkt stehen (externe) Input-Parameter. Ich gebe dem n aus dem Programm drumrum den Namen "a". Warum man dem Teil nen (anderen) Namen geben muss, wenn man das sowieso nur über den Index anspricht (hier 0) weiß ich auch nicht. Ebenso wie ich auch nicht weiß, warum man bei dem einen Parameter ein % und bei dem anderen zwei %% braucht.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

hmm...ich werde mal ein paar tuts suchen, wo das erklärt wird.
hab schon das ein oder andere gefunden. :)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich hab noch ein Problem.

Wenn man jetzt Beispielsweise "^" drückt, muss ich noch eine Taste drücken um das angezeigt zu bekommen.

Kann ich irgendwie das so machen, wenn die Taste gedrückt wurde (KeyStroke==94) das dann an stdin ein Leerzeichen übermittelt wird?


« Visual Basic Porgrammieren lernen ?Programmieren lernen? Und Spaß dabei? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

Tastatur
  Die Tastatur (englisch: Keyboard) ist eines der wichtigsten Eingabegeräte am PC: Mit ihr lassen sich Texte, Befehle und andere Daten in den Computer eingeb...