Created
February 10, 2017 18:57
-
-
Save Alynva/8421083534af67c6e7e080d286add568 to your computer and use it in GitHub Desktop.
Exemplifies the usage of a mouse in console environment. Purely coded in C using gcc compiler (MinGW, to be more precise)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <windows.h> | |
#define MAXCONSOLEINPUTS 20 | |
//This is the input module. It can handle not only Mouse but keyboard also. | |
HANDLE rHnd, wHnd; //Handles for reading and writing to the console. | |
//The Mouse Handle function. Or to be more precise, the pointer to the function | |
int (*handler) (int x, int y, int button,int state); | |
int initializecontrols(); | |
int addmousehandler(int (*func) (int x, int y, int button,int state)); | |
int domouse(); | |
int initializecontrols() { | |
//This module initializes the reading and writing handles. | |
//It must be called before calling any of other functions that make use of | |
//console input and output handles | |
rHnd = GetStdHandle(STD_INPUT_HANDLE); | |
wHnd = GetStdHandle(STD_OUTPUT_HANDLE); | |
if (rHnd == NULL || wHnd == NULL) return FALSE; | |
return TRUE; | |
} | |
int addmousehandler(int (*func) (int x, int y, int button,int state)) { | |
if (func) //If a valid function is passed | |
handler = func; | |
else return FALSE; | |
return TRUE; | |
} | |
int domouse() { | |
//This function should be called to receive the events present in the console buffer | |
//returns nothing but calles the active handler with the event data as parameters | |
long int numEvents =0,i; | |
INPUT_RECORD ConsoleInputs[MAXCONSOLEINPUTS]; | |
int mouseX=0, mouseY=0,mouseButton=0,controlState=0; | |
GetNumberOfConsoleInputEvents (rHnd, &numEvents); | |
//return if nothing good has happened (i.e. no events) | |
if (numEvents == 0) return FALSE; | |
ReadConsoleInput (rHnd,ConsoleInputs,numEvents,&numEvents); | |
//Send each event to its respective handler | |
for (i =0; i<numEvents; i++) { | |
switch (ConsoleInputs[i].EventType) { | |
case MOUSE_EVENT: | |
mouseX =ConsoleInputs[i].Event.MouseEvent.dwMousePosition.X; | |
mouseY =ConsoleInputs[i].Event.MouseEvent.dwMousePosition.Y; | |
controlState = ConsoleInputs[i].Event.MouseEvent.dwControlKeyState; | |
mouseButton = ConsoleInputs[i].Event.MouseEvent.dwButtonState; | |
(*handler) (mouseX,mouseY,mouseButton,controlState); | |
break; | |
case KEY_EVENT: | |
//You can add your own handler here | |
break; | |
} | |
} | |
return TRUE; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <windows.h> | |
#include "INPUT.c" | |
extern HANDLE rHnd,wHnd; //Declared in Input.c | |
//This function is our mouse handler. | |
int mousehandler (int x, int y, int button, int state); | |
void main() { | |
if (!initializecontrols()) { //must call before doing anything | |
printf ("ERROR WHILE INITIALIZING\n"); //if couldn't initialize | |
exit(0); | |
} | |
addmousehandler(mousehandler); //adds our handler. Only one handler at a time | |
while (!kbhit()) //Run until any key is pressed | |
domouse(); | |
} | |
void locate(int x, int y) { | |
COORD pos = {x,y}; | |
SetConsoleCursorPosition (wHnd,pos); | |
} | |
void clearconsole () { | |
int num; | |
//Basically fill the console with a space ' ' | |
FillConsoleOutputCharacter (wHnd,' ',80*80, (COORD) {0,0},&num); | |
locate(0,0); | |
} | |
int mousehandler (int x, int y, int button, int state) { | |
clearconsole(); //Clears the console by filling with spaces. | |
locate (0,0); //Locates the cursor at specified coordinate; | |
printf ("Move around and note things change. Press any key to exit\n"); | |
printf ("X= %2d \t Y= %2d\n",x,y); | |
/*Notes Start | |
Button = 0 No keys pressed | |
Button = 1 Leftmost key pressed | |
Button = 2 Rightmost key pressed | |
Button = 4 From left first key pressed | |
*/ | |
printf ("Button = %d\n", button); | |
/* The space parameter specifies which toggle keys were active and which not*/ | |
if (state & NUMLOCK_ON) | |
printf ("Num Lock Pressed\n"); | |
if (state & CAPSLOCK_ON) | |
printf ("Caps Lock Pressed\n"); | |
if (state & SCROLLLOCK_ON) | |
printf ("Scroll Lock Pressed\n"); | |
return 1; //Can also be written as return TRUE; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment