#include #include #include #include #include using namespace std; #define SCREEN_WIDTH 80 #define SCREEN_HEIGHT 7 #define VK_Q 0x51 //q or Q key void DrawWorld(CHAR_INFO screenBuffer[]); void DrawWon(string Str, int X, int Y, WORD color); bool CheckInput(); //checks user input, if any void HandleInput(CHAR_INFO screenBuffer[]); //acts on user key presses int DaKeyCode = 0; //holds user key id int bKeyDown = 0; // This tells us if we pressed DOWN a key int mPos = 0; COORD cMarker = {0,1}; vectorvDisplay_1; vectorvSelected; bool Shutdown = false; int main() { vDisplay_1.push_back('a'); vDisplay_1.push_back('b'); vDisplay_1.push_back('c'); vDisplay_1.push_back('d'); vDisplay_1.push_back('e'); vDisplay_1.push_back('f'); vDisplay_1.push_back('g'); vDisplay_1.push_back('h'); vDisplay_1.push_back('i'); vDisplay_1.push_back('j'); vDisplay_1.push_back('k'); vDisplay_1.push_back('l'); vDisplay_1.push_back('m'); vDisplay_1.push_back('n'); vDisplay_1.push_back('o'); vDisplay_1.push_back('p'); vDisplay_1.push_back('q'); vDisplay_1.push_back('r'); vDisplay_1.push_back('s'); vDisplay_1.push_back('t'); vDisplay_1.push_back('u'); vDisplay_1.push_back('v'); vDisplay_1.push_back('w'); vDisplay_1.push_back('x'); vDisplay_1.push_back('y'); vDisplay_1.push_back('z'); vDisplay_1.push_back('1'); vDisplay_1.push_back('2'); vDisplay_1.push_back('3'); vDisplay_1.push_back('4'); vDisplay_1.push_back('5'); vDisplay_1.push_back('6'); vDisplay_1.push_back('7'); vDisplay_1.push_back('8'); vDisplay_1.push_back('9'); vDisplay_1.push_back('0'); vDisplay_1.push_back(' '); vDisplay_1.push_back('A'); vDisplay_1.push_back('B'); vDisplay_1.push_back('C'); vDisplay_1.push_back('D'); vDisplay_1.push_back('E'); vDisplay_1.push_back('F'); vDisplay_1.push_back('G'); vDisplay_1.push_back('H'); vDisplay_1.push_back('I'); vDisplay_1.push_back('J'); vDisplay_1.push_back('K'); vDisplay_1.push_back('L'); vDisplay_1.push_back('M'); vDisplay_1.push_back('N'); vDisplay_1.push_back('O'); vDisplay_1.push_back('P'); vDisplay_1.push_back('Q'); vDisplay_1.push_back('R'); vDisplay_1.push_back('S'); vDisplay_1.push_back('T'); vDisplay_1.push_back('U'); vDisplay_1.push_back('V'); vDisplay_1.push_back('W'); vDisplay_1.push_back('X'); vDisplay_1.push_back('Y'); vDisplay_1.push_back('Z'); vDisplay_1.push_back('@'); vDisplay_1.push_back('#'); vDisplay_1.push_back('$'); vDisplay_1.push_back('%'); vDisplay_1.push_back('+'); vDisplay_1.push_back('-'); vDisplay_1.push_back('!'); vDisplay_1.push_back('?'); vDisplay_1.push_back('='); vDisplay_1.push_back('*'); vDisplay_1.push_back('.'); vDisplay_1.push_back(':'); vDisplay_1.push_back('('); vDisplay_1.push_back(')'); CHAR_INFO screenBuffer[SCREEN_WIDTH * SCREEN_HEIGHT] = {0}; string strung; cout << "Keylogger blocker." << endl; cout << "******************" << endl; cout << "Move red selector bar with arrow keys, spacebar: select." << endl; cout << "Delete: erase selected text, backspace: delete last character." << endl; cout << "Tab: copy to clipboard, paste in other application." << endl; cout << "Press q or Q to quit." << endl; cout << "******************" << endl; cout << "(Tord Hjalt 2022.)" << endl; cout << "Choose normal (nor) (default) or scrambed (scr) display now:" << endl; cin >> strung; if(strung == "nor") { //erase 'nor': DrawWon(" ", 0, 7, FOREGROUND_GREEN | FOREGROUND_INTENSITY); DrawWon(" ", 0, 8, FOREGROUND_GREEN | FOREGROUND_INTENSITY); DrawWon(" ", 0, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } else if(strung == "scr") { //erase 'scr': DrawWon(" ", 0, 7, FOREGROUND_GREEN | FOREGROUND_INTENSITY); DrawWon(" ", 0, 8, FOREGROUND_GREEN | FOREGROUND_INTENSITY); DrawWon(" ", 0, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY); std::random_shuffle ( vDisplay_1.begin(), vDisplay_1.end() ); } else { //erase 'whatever': DrawWon(" ", 0, 7, FOREGROUND_GREEN | FOREGROUND_INTENSITY); DrawWon(" ", 0, 8, FOREGROUND_GREEN | FOREGROUND_INTENSITY); DrawWon(" ", 0, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } screenBuffer[cMarker.X + cMarker.Y * SCREEN_WIDTH].Char.AsciiChar = '|'; screenBuffer[cMarker.X + cMarker.Y * SCREEN_WIDTH].Attributes = FOREGROUND_RED|FOREGROUND_INTENSITY; DrawWorld(screenBuffer); DrawWon("", 0, 0, FOREGROUND_GREEN | FOREGROUND_INTENSITY); for(int j = 0; j < vDisplay_1.size(); j++) { cout << vDisplay_1[j]; } while(1) { if(CheckInput()) //if user pressed a key: HandleInput(screenBuffer); DrawWon(" ", 2, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY); for(int i = 0; i < vSelected.size(); i++) { cout << vSelected[i]; } if(Shutdown) return 0; } return 0; } //////////////////////////////// DRAW WORLD ///////////////////////////////// ///// ///// This draws the screenBuffer to the screen ///// //////////////////////////////// DRAW WORLD ///////////////////////////////// void DrawWorld(CHAR_INFO screenBuffer[]) { SMALL_RECT drawRect = {0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1}; COORD bufferSize = {SCREEN_WIDTH , SCREEN_HEIGHT}; COORD zeroZero = {0, 0}; HANDLE hOutput; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); WriteConsoleOutput(hOutput, screenBuffer, bufferSize, zeroZero, &drawRect); } //////////////////////////////// DRAW Won ///////////////////////////////// //for displaying current points etc //////////////////////////////// DRAW Won ///////////////////////////////// void DrawWon(string Str, int X, int Y, WORD color) { HANDLE OutputH; COORD position = {X, Y}; OutputH = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(OutputH, color); SetConsoleCursorPosition(OutputH, position); cout << Str; //display won or lost } //////////////////////// check input //////////////////////////////////////// //////////////////CHECK INPUT////////////////////////////////////////////// bool CheckInput() { DWORD events=0; HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); INPUT_RECORD InputRecord; GetNumberOfConsoleInputEvents(hInput, &events); if(!events) return false; ReadConsoleInput(hInput, &InputRecord, 1, &events); bKeyDown = InputRecord.Event.KeyEvent.bKeyDown; DaKeyCode = InputRecord.Event.KeyEvent.wVirtualKeyCode; return true; } ////////////////////// Handle Input //////////////////////////////////// //************************************************************************// ////////////////////// Handle Input //////////////////////////////////// void HandleInput(CHAR_INFO screenBuffer[]) { if(bKeyDown > 0) { if((GetKeyState(VK_RIGHT) & 0x8000) != 0) //right { //mRight = true; mLeft = false; COORD OldcMarker = cMarker; if(cMarker.X < vDisplay_1.size()) { cMarker.X++; //move right mPos++; //log positional change: } //draw marker at new position: screenBuffer[cMarker.X + cMarker.Y * SCREEN_WIDTH].Char.AsciiChar = '|'; screenBuffer[cMarker.X + cMarker.Y * SCREEN_WIDTH].Attributes = FOREGROUND_RED|FOREGROUND_INTENSITY; //erase old position: screenBuffer[OldcMarker.X + OldcMarker.Y * SCREEN_WIDTH].Char.AsciiChar = ' '; screenBuffer[OldcMarker.X + OldcMarker.Y * SCREEN_WIDTH].Attributes = 0; DrawWorld(screenBuffer); DrawWon("", 0, 0, FOREGROUND_GREEN | FOREGROUND_INTENSITY); for(int j = 0; j < vDisplay_1.size(); j++) { cout << vDisplay_1[j]; } } else if((GetKeyState(VK_LEFT) & 0x8000) != 0 ) //left { //mRight = true; mLeft = false; COORD OldcMarker = cMarker; if(cMarker.X > 0) { cMarker.X--; //move left mPos--; //log positional change: } //draw marker at new position: screenBuffer[cMarker.X + cMarker.Y * SCREEN_WIDTH].Char.AsciiChar = '|'; screenBuffer[cMarker.X + cMarker.Y * SCREEN_WIDTH].Attributes = FOREGROUND_RED|FOREGROUND_INTENSITY; //erase old position: screenBuffer[OldcMarker.X + OldcMarker.Y * SCREEN_WIDTH].Char.AsciiChar = ' '; screenBuffer[OldcMarker.X + OldcMarker.Y * SCREEN_WIDTH].Attributes = 0; DrawWorld(screenBuffer); DrawWon("", 0, 0, FOREGROUND_GREEN | FOREGROUND_INTENSITY); for(int j = 0; j < vDisplay_1.size(); j++) { cout << vDisplay_1[j]; } } else if(((GetKeyState(VK_SPACE) & 0x8000) != 0 )&&(mPos > -1) )//space = select char { char selch = vDisplay_1[mPos]; vSelected.push_back(selch); //vSelected.push_back[vDisplay_1[mPos]]; //DrawWon(" ", 27, 0, FOREGROUND_GREEN | FOREGROUND_INTENSITY); //cout << selch; } else if(((GetKeyState(VK_DELETE) & 0x8000) != 0 ) )//delete all { vSelected.erase(vSelected.begin(),vSelected.end()); DrawWon(" ", 2, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } else if(((GetKeyState(VK_BACK) & 0x8000) != 0 ))//delete last char { vSelected.erase(vSelected.end() - 1); DrawWon(" ", 2, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } else if((GetKeyState(VK_TAB) & 0x8000) != 0) //send selected to clipboard { string sOutput; for(int m = 0; m < vSelected.size(); m++) { sOutput = sOutput + vSelected[m]; } //convert string format and access clipboard memory: HWND hwnd; const std::string &s = sOutput; OpenClipboard(hwnd); EmptyClipboard(); HGLOBAL hg=GlobalAlloc(GMEM_MOVEABLE,s.size()+1); memcpy(GlobalLock(hg),s.c_str(),s.size()+1); GlobalUnlock(hg); SetClipboardData(CF_TEXT,hg); CloseClipboard(); GlobalFree(hg); DrawWon("copied to clipboard, ready to paste", 3, 11, FOREGROUND_GREEN | FOREGROUND_INTENSITY); Sleep(2000); DrawWon(" ", 3, 11, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } else if((GetKeyState(VK_Q) & 0x8000) != 0) //q or Q, shut down { Shutdown = true; } } }//end handle input