Hvordan får du musen input i et C-konsol program på Windows-10?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har brug for at interagere med brugerens mus input i mit simple C konsol program. Jeg gjorde nogle undersøgelser og fundet en relateret Microsoft 's doks på deres side her. Til en begyndelse kopierede jeg hele deres prøvekode og indsatte det i min editor. Ved kompilering bliver det kompileret godt, med en dejlig lille '.exe', som når kører, fortæller/udskriver korrekt alle 'Nøglehændelser' og 'Ændre størrelsesbegivenheder', men No Mouse event! Hvordan kan man med succes få musen ind i C-konsolprogrammet? Min MCVE er den givne prøvekode her på Microsofts websted, da jeg brugte denne prøvekode ordret! Jeg bruger Windows 10 Pro (1703), bare i tilfælde. [8] [10]





EDIT: - Det ser ud til at være et problem, som ikke er unikt for mig. En anden StackOverflow-bruger rapporterede også det samme problem her på hans Windows-10-system. Hans leverede MCVE arbejdede også på Windows 7, men ikke på Windows-10, ligesom mit citerede MCVE på Microsofts websted som en prøvekode kan arbejde på ældre Windows-versioner, men ikke på Windows-10, hvor 'Hurtig redigeringstilstand' tilsyneladende er aktiveret i 'Console-standarder' .

Bedste reference


Efter at have brugt timer har jeg fundet skylden for fejl i det citerede i min forespørgsel Microsoft's officielle prøvekode her. Og synderen er selve konsollen selv! Faktisk er det 'em ' setting ' nemlig 'Hurtig redigeringstilstand' til 'Konsol Windows' . [13]


Du kan få adgang til det ved at:



  1. Åbner kommandoprompt og højreklik på titellinjen og klik derefter på 'Standard'

  2. Der vises en dialogboks med titlen 'Egenskaber for Windows-konsol' . På fanen Valg under Rediger indstillinger underrubrik, kan du finde afkrydsningsfeltet Hurtig redigeringstilstand !



Jeg har vedhæftet skærmbilleder nedenfor:


Vises Menu efter at have lavet Højreklik på Kommandopromptets titellinje  Console Windows Egenskaber [14] [15]


Problemet blev forårsaget af den 'Hurtig redigeringstilstand' -indstilling, som blev aktiveret (afkrydsningsfeltet er markeret) som standard på min Windows 10. Og i denne aktiverede status, vil denne 'Hurtig redigeringstilstand' indtog alle mus-begivenheder og blev ikke afsendt til min '.exe'.


Når dette 'Hurtig redigeringstilstand' valgmulighed er markeret (deaktiveret), kører programmet fint som beregnet/kodet i denne prøvekode her og fortæller/udskriver alle Mus-begivenheder. [[Phew!]] [[[16]


BEMÆRK: Ændringen i 'Konsolegenskaber' kræver genstart af konsollen, der træder i kraft.





REDIGER: FORBEDRET 'PORTABLE' LØSNING!


Opløsningen ovenfor er ikke 'bærbar'. Det er bare for lokalmaskinen og selvfølgelig er det også 'manuel arbejde'. For at gøre denne prøvekode arbejde uden at kræve brugeren at deaktivere Hurtig redigeringstilstand 'manuelt' som forklaret ovenfor, kan vi deaktivere Hurtig redigeringstilstand programmatisk ved at tilføje følgende linjer kode inde i denne prøvekode [17] [18]


        /* 
           Step-1:
           Disable 'Quick Edit Mode' option programmatically
        */
        fdwMode = ENABLE\_EXTENDED\_FLAGS;
        if (! SetConsoleMode(hStdin, fdwMode) )
             ErrorExit("SetConsoleMode");
        /* 
           Step-2:
           Enable the window and mouse input events,
           after you have already applied that 'ENABLE\_EXTENDED\_FLAGS'
           to disable 'Quick Edit Mode'
        */
        fdwMode = ENABLE\_WINDOW\_INPUT | ENABLE\_MOUSE\_INPUT;
        if (! SetConsoleMode(hStdin, fdwMode) )
            ErrorExit("SetConsoleMode");


Jeg fandt ud af at 'ENABLE\_EXTENDED\_FLAGS' mulighed på Microsofts dokumenter om SetConsoleMode() [19]


Når vi har søgt ENABLE\_EXTENDED\_FLAGS i SetConsoleMode() -funktionen, vil vores program modtage/udskrive alle 'Mus Events', selv om brugeren har 'Quick Edit Mode' indstillingen aktiveret i Konsolindstillinger muligheder. Og efter at vores program er færdig med at udføre sit job (modtagelse af musebegivenheder i dette super enkle scenario), vil brugerens konsolindstillinger være uforstyrret, for inden programmet afslutter, vil det gendanne brugerens originale (gemt i starten af ​​vores program) Konsoltilstand som følger:


         /* Restore original console mode before exit. */
         SetConsoleMode(hStdin, fdwSaveOldMode);


Som det er gjort i den prøvekode der, der fungerer godt, men fejler at udskrive mushændelser, hvis brugeren har 'Hurtig redigeringstilstand' aktiveret i sin konsol. For at gøre denne prøvekode arbejde i scenarier, hvor brugerens Konsolindstillinger har 'Hurtig redigeringstilstand' aktiveret, bør vi medtage/indsætte kodeeksemplet i denne prøvekode (ved at anvende [[ENABLE\_EXTENDED\_FLAGS som vist i dette 'REDIGER' afsnit ovenfor. [20] [21] [22]