Articles de lecture sur simulateur

Bonjour, mon cher. Je voudrais partager mon histoire et un petit hack de vie.


Je pense que tous les employés de bureau sont dans une situation où, après un délicieux déjeuner, ils sont très fatigués et veulent faire une sieste. En fait, le sommeil diurne est très utile à la fois pour le corps et pour le travail, car il a un effet très positif sur la productivité. Cependant, selon mon expérience, plus de 20 minutes est un buste. Cela suffit pour que le corps se normalise. Et après littéralement une minute, pendant laquelle j'ai vraiment envie de continuer à dormir, le corps se réveille, on ressent de la vigueur et un regain de force.


D'un autre côté, beaucoup de gens préfèrent une tasse de café. Et bien qu'il semble que cela aide, en fait, le corps ne restaure pas ses ressources, mais perd seulement plus. Oui, et c'est dangereux.


En général, il est clair de quoi il s'agit, non? cependant, la question se pose naturellement de savoir comment faire monter les choses au bureau. Et le fait est que la plupart des patrons ne l'approuvent pas. Et le canapé n'est pas partout. Oui, et il est peu probable que vous vous autorisiez à faire une sieste si vous appréciez votre lieu de travail.


Cependant, j'ai eu de la chance, ma chaise peut beaucoup se pencher en arrière, et je peux généralement avoir l'air de travailler en pensant. Et tout irait bien, sinon pour une chose.


Une image absolument statique sur les moniteurs me trahit avec des abats!


J'ai en quelque sorte partagé ce problème avec un ami, et il a proposé en plaisantant de faire un simulateur de travail.
Cependant, j'ai vraiment aimé l'idée de mettre en œuvre un simulateur de travail à part entière - qu'est-ce que c'est censé être? est-ce qu'elle pourrait travailler pour moi? En général, il est clair que créer cela serait extrêmement difficile. Mais on pourrait simplifier la tâche.


De profession, je suis un simple programmeur C ++, et donc très souvent je rampe sur Internet et je lis différents articles. Sans cela, ils le comprennent tous.


Si vous observez une personne qui lit un article long et complexe, vous remarquerez qu'il fait régulièrement défiler l'article de haut en bas. Et c'est ce que j'ai décidé de mettre en œuvre.
Après littéralement une heure de navigation sur Internet, en combinant le matériel de trois articles (articles sur une application cachée sans fenêtre, sur la capture d'événements clavier et articles sur la simulation d'événements souris), un programme simple a été implémenté, que je voudrais partager avec les gens.


L'idée est simple à la base: des événements aléatoires de défilement de la molette de la souris. Autrement dit, vous choisissez simplement un article plus authentique et plus compliqué pour la tâche en cours, allumez le simulateur et vous endormez vous-même. Le programme n'est pas visible dans le gestionnaire de tâches (ou je l'aveugle simplement et je ne l'ai pas trouvé là-bas), l'utilisation de la combinaison de touches Ctrl + barre d'espace est interrompue et reprend l'exécution, et lorsque vous cliquez sur la flèche vers le bas, il se ferme. Vous pouvez voir le programme via la console à l'aide de la commande tasklist, et si nécessaire, vous pouvez trouver son PID afin de le fermer via taskkill.


Je ne comprends pas moi-même le code du programme, il n'y aura donc pas de commentaires.


En fait, le code lui-même:


#define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0500 #include <stdio.h> #include <iostream> #include <stdlib.h> #include <time.h> #include <conio.h> #include <string.h> #include <windows.h> HHOOK hKeyboardHook; #define X 500 #define Y 500 #define SCREEN_WIDTH 1920 #define SCREEN_HEIGHT 1080 bool bQuit = false; bool bPause = false; __declspec(dllexport) LRESULT CALLBACK KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam) { DWORD SHIFT_key = 0; DWORD CTRL_key = 0; DWORD ALT_key = 0; if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN))) { KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); DWORD dwMsg = 1; dwMsg += hooked_key.scanCode << 16; dwMsg += hooked_key.flags << 24; char lpszKeyName[1024] = { 0 }; int i = GetKeyNameText(dwMsg, (lpszKeyName + 1), 0xFF) + 1; int key = hooked_key.vkCode; SHIFT_key = GetAsyncKeyState(VK_SHIFT); CTRL_key = GetAsyncKeyState(VK_CONTROL); ALT_key = GetAsyncKeyState(VK_MENU); //printf("Keycode = %c\n", key); if (key == VK_DOWN) { bQuit = true; PostQuitMessage(0); } if (CTRL_key != 0 && key == ' ') { bPause = !bPause; } //if (key >= 'A' && key <= 'Z') //{ // if (GetAsyncKeyState(VK_SHIFT) >= 0) key += 32; // /********************************************* // *** Hotkey scope *** // *** do stuff here *** // **********************************************/ // if (CTRL_key != 0 && key == 'y') // { // MessageBox(NULL, "CTRL-y was pressed\nLaunch your app here", "HOTKE Y", MB_OK); // CTRL_key = 0; // //do stuff here // } // if (CTRL_key != 0 && key == 'q') // { // MessageBox(NULL, "Shutting down", "HOTKE Y", MB_OK); // bQuit = true; // PostQuitMessage(0); // } // // SHIFT_key = 0; // CTRL_key = 0; // ALT_key = 0; //} } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } void MessageLoop() { MSG message; while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } } DWORD WINAPI my_HotKey(LPVOID lpParm) { HINSTANCE hInstance = GetModuleHandle(NULL); if (!hInstance) hInstance = LoadLibrary((LPCSTR)lpParm); if (!hInstance) return 1; hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, hInstance, NULL); MessageLoop(); UnhookWindowsHookEx(hKeyboardHook); return 0; } void MouseSetup(INPUT *buffer) { buffer->type = INPUT_MOUSE; buffer->mi.dx = (0 * (0xFFFF / SCREEN_WIDTH)); buffer->mi.dy = (0 * (0xFFFF / SCREEN_HEIGHT)); buffer->mi.mouseData = 0; buffer->mi.dwFlags = MOUSEEVENTF_ABSOLUTE; buffer->mi.time = 0; buffer->mi.dwExtraInfo = 0; } void MouseMoveAbsolute(INPUT *buffer, int x, int y) { buffer->mi.dx = (x * (0xFFFF / SCREEN_WIDTH)); buffer->mi.dy = (y * (0xFFFF / SCREEN_HEIGHT)); buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE); SendInput(1, buffer, sizeof(INPUT)); } void MouseClick(INPUT *buffer) { buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN); SendInput(1, buffer, sizeof(INPUT)); Sleep(10); buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP); SendInput(1, buffer, sizeof(INPUT)); } void MouseWheel(INPUT *buffer, bool bUp) { buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_WHEEL); if(bUp) buffer->mi.mouseData = 120; else buffer->mi.mouseData = -120; SendInput(1, buffer, sizeof(INPUT)); } /* declare window procedure for this application. */ LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR szArgs, int nCmdShow) { HANDLE hThread; DWORD dwThread; hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)my_HotKey, (LPVOID)szArgs[0], NULL, &dwThread); INPUT buffer[1]; int probability = 3; // probability / 1000 int pr = probability; int repeat = 0; while (!bQuit) { if (bPause) { continue; Sleep(100); } MouseSetup(buffer); int p = rand() % 1000; if (p < pr) { if(p >= (pr + 1) / 2) MouseWheel(buffer, true); else MouseWheel(buffer, false); pr-=100; if (pr < probability) pr = probability; } else { pr++; } Sleep(100); } if (hThread) return WaitForSingleObject(hThread, INFINITE); return 0; //MSG Msg; // save window messages here. // /* Run the message pump. It will run until GetMessage() returns 0 */ //while (GetMessage(&Msg, NULL, 0, 0)) //{ // TranslateMessage(&Msg); // Translate virtual-key messages to character messages // DispatchMessage(&Msg); // Send message to WindowProcedure //} //return Msg.wParam; return 0; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { case VK_ESCAPE: { MessageBox(NULL, "You hit escape, quitting now.", "Message", 0); PostQuitMessage(0); break; } // handle non-trapped messages. default:return DefWindowProc(hWnd, Message, wParam, lParam); } return 0; // this indicates a message was trapped. } 

Le code n'est pas effacé des commentaires inutiles et autres ordures pour la simple raison qu'il peut être utile pour quelqu'un de comprendre. Malheureusement, je ne peux pas joindre le fichier exécutable pour les paresseux.


Je voudrais noter que je ne recommande à personne d'utiliser ce programme et que je ne risque pas de l'utiliser. Après tout, si vous vous êtes simplement assoupi sur le lieu de travail, cela peut s'expliquer par une mauvaise santé, une longue absence de vacances ou autre chose. Et si quelqu'un comprend que vous essayez de le tromper, ce sera déjà mauvais, offensant et désagréable. Et il est peu probable que cela ait un effet positif sur votre carrière.

Source: https://habr.com/ru/post/fr441096/


All Articles