Tastenabfrage C++



  • so.. ^^ hi bin neu hier (und auf einmal geht dieses erstellen von threads oO egal)

    naja ich hab ne frage.. ich sitz an einem kleinen problem.. ich würde gerne was programmieren wo beim drücken einer taste ein sound ausgegeben wird.

    #include <stdio.h>
    #include <windows.h>
    #include <dos.h>
    #include <conio.h>
    #include <sound.h>
    
    int main(){
        int end;
        char key = getch();
        end=0;
    
        while (end==0) {
          scanf("%c",&key);
          system("cls");
    
          switch(key) {
             case'a': printf("\a"); break;
             case's': printf("\a"); break;
             /* Programm Ende */
             case'0': end=end+1; break;
          }
         }
    }
    

    ich bin noch nen ziemlicher anfänger in sachen c/c++ aber naja ^^" versuchs halt

    wie gesagt: um den sound zu hören muss ich erst A bzw S und dann enter drücken..

    ich würde nur halt gerne wissen obs eine möglichkeit der direkten tasten eingabe gibt. also wenn ich dann nur A drücken will damit der Case sich erfüllt.. idealerweise wärs auch noch wenn die eingabe nicht angezeigt würde.

    da ich später sowas wie "drücken sie 0 zum beenden des programms" stehn haben möchte.

    gibs da ne möglichkeit?

    ps: kann mir jemand sound.h schicken? seh grad das hab ich nich uu



  • Also im reinen c (c++ geht evtl in konsole, falls das hast, auch events. aber keine ahnung nie getestet) kannst kbhit verwenden das erfordert aber eine programmschleife, denn kbhit sagt erstmal nur ob eine taste gedrückt wurde. also ca. so:

    [cpp]
    void main()
    {
    int taste = 0; // weis nicht ob int nun der richtige typ ist aber das merkst ja^^
    
        while (taste != VK_Escape)
        {
            if (kbhit)
            {
                taste = getch(); // getch könnte falsch sein, atm keine hilfe zur hand aber bei kbhit findest die dazugehörige auslesefunktion
    
                if (taste == VK_A) // kann sein das es VK_A nicht gibt schau in der hilfe mal bei vk_escape o. vk_1 da findest die direkten werte für die keys
                {
                    playsound("muhhh.wav"); // selbstausgedacht hier muss nat. dein code hin
                }
            }
        }
    }
    [/cpp]
    

    und keine bange das er immer alle bedingungen durchgeht, er kommt nur dazu wenn erst kbhit() true liefert und das macht es nur wenn eine taste gedrückt wurde. wenn du aber mit höheren biblotheken arbeitest kannst auch events nehmen und einen tastendrück abzufangen. evtl hilft es dir ja ein wenig weiter und sry wie gesagt atm keine hilfe da und sehr lange her das ich konsole geprogt habe.

    P.S.: nur habe ich keine ahnung wie dfas hier mit den tags geht^^



  • das gnaze will iwie nich so wie gedacht.. mhh..

    #include <stdio.h>
    #include <windows.h>
    #include <dos.h>
    #include <conio.h>
    /* #include <sound.h> muss noch hinzugefügt werden */

    int main(){
        int end;
        char key = getch();
        end=0;
    
        printf("Keyboard 1.0 Pre-Alpha by YamiSparrow\n");
    
        while (kbhit() && end==0) {
          key = getch();
          system("cls");
    
        if (key == 'a') {printf("\a");}
        else if (key == 's') {printf("\a");}
            /* Programmende */
        else if (key == '0') {end=end+1;}
    
          }
    }
    

    so wollt ichs auch versuchen oO aber das will auch iwie nicht xx



  • Das ist ja auch falsch.
    Erst kbhit() solange abfragen bis eine Taste gedrückt wurde und dann mittels getch() das Zeichen lesen:

    while(!kbhit())
    {
    }
    
    key = getch();
    
    switch(key)
    {
     ...
    }
    


  • Kann man sich das nicht komplett sparen? getchar() arbeitet doch blockierend.



  • Nein geht nicht, da man bei getchar() erst immer einmal Return/Enter gedrückt haben muß, ehe die Zeichen gelesen werden können (und gerade das will YamiSparrow eben nicht).



  • ehh mal ne frage nebenbei *peinlich* wie geht das mit dem code korrekt anzeigen raffe das nicht fasse das in die tags

    habe es auch mit cpp versucht und eine kombi von beiden nix geht^^. dann stell ich mal richtig code rein.



  • Code
    


  • #include <conio.h>
    #include <stdio.h>
    
    #define key_esc 0x1b // = VK_ESCAPE
    #define key_f1  0x70 // = VK_F1
    #define key_f2  0x71 // = VK_F2
    #define key_f3  0x72 // = VK_F3
    
    void DoAction(char taste)
    {
    	if (taste == key_f1)
    	{
    		printf("Taste F1 gedrückt!\n");
    	}
    	else if (taste == key_f2)
    	{
    		printf("Taste F2 gedrückt!\n");
    	}
    	else if (taste == key_f3)
    	{
    		printf("Taste F3 gedrückt!\n");
    	}
    }
    
    void main(void)
    {
    	char taste = 0;
    
    	while (taste != key_esc)
    	{
    		taste = 0;
    
    		if (_kbhit())
    		{
    			taste = _getch();
    		}
    
    		if (taste > 0)
    		{
    			DoAction(taste);
    		}
    	}
    }
    

    so bitte das sollte gehen

    Edit: wieso geht das nicht bei mir?

    EditEdit: @Th auf meine weise kann er aber noch andere programmabläufe durcharbeiten bei dir bleibt er in der while hängen, sonst jepp geht auch

    EditEditEdit: Ich habs gerafft geil^^



  • ich wollt jetzt keinen neuen Thread eröffnen, gehört zwar nicht direkt hier her, aber es passt doch irgendwie:

    wie findet man den hex-code einer taste raus, so wie yammi es gemacht hat?

    und wie ist es, wenn man sondertasten hat, wie bei meinem laptop der WLAN oder der Sound Knopf?



  • ich hasse es wenn leute meinen namen falsch schreiben -_____-

    *sfz*

    egal.. ich versuch dann mal die eine lösung da.

    *edit*

    jau ^^ super funkt einwandfrei.. das einzige was ich noch brauche ist ne sound.h datei..

    kann mir die wer geben!? ^^



  • @X schau online msdn oder wenn selber eine hast stichwort "virtual key codes" da findest alles was du brauchst glaube sogar die extratasten inklusive



  • XaTrIxX schrieb:

    ich wollt jetzt keinen neuen Thread eröffnen, gehört zwar nicht direkt hier her, aber es passt doch irgendwie:

    wie findet man den hex-code einer taste raus, so wie yammi es gemacht hat?

    und wie ist es, wenn man sondertasten hat, wie bei meinem laptop der WLAN oder der Sound Knopf?

    die stehen doch eh hier: http://de.wikipedia.org/wiki/ASCII-Tabelle

    lg



  • @Composer nicht ganz er will die keycodes nicht die codes der zeichen, soll heissen den code den die tastatur liefert wenn du zb. a drückst, und da ist egal ob am ende ein kleines oder großes a da steht, der tastencode ist immer derselbe. Das OS interpretiert den code eben anhand der umschaltasten und schmeist das dazugehörige zeichen raus bzw führt die damit verbundene aktion aus.

    Edit: Onlinegaming versaut echt, muss mir dieses fraktalsatz geschreibe hier abgewöhnen 😃



  • Hi oelsni,

    den Programm, den du vorhin für den YamiSparrow geschrieben hast, funkt ned tadellos. Wenn ich F1 drücke passiert gar nichts. Außerdem steigt, die CPU-Überlastung auf 100, wenn ich das Programm ausführe.

    lg



  • ist ja klar wegen der whileschleife, ie rattert ja nu die ganze zeit^^. Aber das mit F1 wundert mich habe ich ausversehen falschen code benutzt mom eben testen.

    Edit: orrgs 😮 ich volltrottel _getch wars ja garnicht, die gibt doch ascii code zurück. Ganz großes SRY, das habe ich total verrafft kein wunder das es nicht geht. ist lang her als ich das mit tastencode gemacht habe suche das eben schnell und stelle die korrektur hier rein und nochmal Sry, war ziemlich panne von mir 😞



  • Mit C++ (bzw. C) Standard-Mittel ist es nicht möglich, die Tasten direkt abzufragen. Da mußt du dann schon betriebssystemspezifische Funktionen aufrufen. Unter Windows z.B. GetAsyncKeyState(...)



  • jepp habe es damals mit GetKeyboardState gemacht, nur weis ich jetzt auch wieder warum ich auf _kbhit() und _getch() übergangen bin 😃

    baue aber dennoch gerade nen bsp. nur leider ist das nicht so schön anzusehen wie mein vorhergehendes


Anmelden zum Antworten