Simulador de lectura de artículos

Buenas tardes querida. Me gustaría compartir mi historia y un pequeño truco de vida.


Creo que todos los trabajadores de oficina tienen una situación en la que, después de un sabroso almuerzo, están muy cansados ​​y quieren tomar una siesta. De hecho, el sueño durante el día es muy útil tanto para el cuerpo como para el trabajo, ya que tiene un efecto muy positivo en la productividad. Sin embargo, en mi experiencia, más de 20 minutos es un fracaso. Esto es suficiente para que el cuerpo se normalice. Y después de literalmente un minuto, durante el cual realmente quiero seguir durmiendo, el cuerpo se despierta, sientes vigor y una oleada de fuerza.


Por otro lado, muchas personas prefieren una taza de café. Y aunque parece que esto ayuda, de hecho, el cuerpo no restaura sus recursos, sino que solo pierde más. Sí, y es dañino.


En general, está claro de qué se trata, ¿verdad? Sin embargo, la pregunta que surge naturalmente es cómo hacer esto en la oficina. Y es que la mayoría de los jefes no aprueban esto. Y el sofá no está en todas partes. Sí, y es poco probable que te permitas tomar una siesta si valoras tu lugar de trabajo.


Sin embargo, tuve suerte, mi silla puede reclinarse mucho y, en general, puedo parecer que funciona, solo pensando. Y todo estaría bien, si no fuera por una cosa.


¡La imagen absolutamente estática en los monitores me traiciona con menudillos!


De alguna manera compartí este problema con un amigo, y él en broma se ofreció a hacer un simulador de trabajo.
Sin embargo, me gustó la idea de implementar un simulador de trabajo completo: ¿qué se supone que es? ¿Qué es y podría funcionar para mí? En general, está claro que crear esto sería extremadamente difícil. Pero uno podría simplificar la tarea.


Por ocupación, soy un simple programador de C ++ y, por lo tanto, muchas veces me arrastro por Internet y leo varios artículos. Sin esto, todos lo entienden.


Si observa a una persona que lee un artículo largo y complejo, notará que periódicamente lo desplaza hacia arriba y hacia abajo. Y esto es lo que decidí implementar.
Después de literalmente una hora de navegar por Internet, combinando el material de tres artículos (artículos en una aplicación oculta sin ventana, capturando eventos de teclado y artículos sobre simulación de eventos de mouse), se implementó un programa simple que me gustaría compartir con la gente.


La idea es simple en su esencia: eventos aleatorios de desplazamiento de la rueda del mouse. Es decir, simplemente elige un artículo que sea más auténtico y más complicado para la tarea actual, enciende el simulador y te duermes tú mismo. El programa no es visible en el administrador de tareas (o simplemente lo cegué y no lo encontré allí), usando la combinación de teclas Ctrl + barra espaciadora se detiene, y reanuda la ejecución, y cuando hace clic en la flecha hacia abajo se cierra. El programa se puede ver a través de la consola utilizando el comando tasklist y, si es necesario, puede encontrar su PID para cerrarlo mediante taskkill.


Yo mismo no entiendo completamente el código del programa, por lo que no habrá comentarios.


En realidad, el código en sí:


#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. } 

El código no está libre de comentarios innecesarios y otros elementos basura por la sencilla razón de que puede ser útil para que alguien lo entienda. Lamentablemente, no puedo adjuntar el archivo ejecutable para los vagos.


Me gustaría señalar que no recomiendo usar este programa a nadie, y yo mismo no me arriesgaré a usarlo. Después de todo, si acaba de quedarse dormido en el lugar de trabajo, esto puede explicarse al referirse a la mala salud, la ausencia prolongada de vacaciones u otra cosa. Y si alguien entiende que estás tratando de engañarlo, ya será malo, ofensivo y desagradable. Y es poco probable que tenga un efecto positivo en su carrera.

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


All Articles