Boa tarde querida Eu gostaria de compartilhar minha história e um pequeno truque de vida.
Acho que todos os trabalhadores de escritório têm uma situação em que, após um almoço saboroso, estão muito cansados e querem tirar uma soneca. De fato, o sono diurno é muito útil tanto para o corpo quanto para o trabalho, pois tem um efeito muito positivo na produtividade. No entanto, na minha experiência, mais de 20 minutos é um fracasso. Isso é suficiente para o corpo se normalizar. E depois de literalmente um minuto, durante o qual eu realmente quero continuar a dormir, o corpo acorda, você sente vigor e uma onda de força.
Por outro lado, muitas pessoas preferem uma xícara de café. E, embora pareça que isso ajude, de fato, o corpo não restaura seus recursos, mas apenas perde mais. Sim, e é prejudicial.
Em geral, está claro do que se trata, certo? no entanto, naturalmente surge a questão de como colocar isso em prática no escritório. E o fato é que a maioria dos chefes não aprova isso. E o sofá não está em todo lugar. Sim, e é improvável que você se permita tirar uma soneca se valorizar seu local de trabalho.
No entanto, tive sorte, minha cadeira pode recostar-se muito e geralmente posso parecer trabalhando, apenas pensando. E tudo ficaria bem, se não fosse por uma coisa.
Imagem absolutamente estática nos monitores me trai com crianças!
De alguma forma, compartilhei esse problema com um amigo, e ele, brincando, se ofereceu para fazer um simulador de trabalho.
Eu realmente gostei da idéia, no entanto, de implementar um simulador de trabalho completo - o que deveria ser? o que é e poderia funcionar para mim? Em geral, é claro que criar isso seria extremamente difícil. Mas pode-se simplificar a tarefa.
Por profissão, sou um simples programador de C ++ e, portanto, muitas vezes rastreio na Internet e leio vários artigos. Sem isso, todos eles entendem.
Se você observar uma pessoa que lê um artigo longo e complexo, notará que ela rola o artigo periodicamente para cima e para baixo. E foi isso que decidi implementar.
Depois de literalmente uma hora navegando na Internet, combinando o material de três artigos (artigos em um aplicativo oculto sem janela, capturando eventos de teclado e artigos sobre simulação de eventos de mouse), um programa simples foi implementado, que eu gostaria de compartilhar com as pessoas.
A idéia é simples: eventos aleatórios de rolagem da roda do mouse. Ou seja, você simplesmente escolhe um artigo que é mais autêntico e mais complicado para a tarefa atual, liga o simulador e dorme calmamente. O programa não está visível no gerenciador de tarefas (ou apenas cego e não o encontrei lá), usando a combinação de teclas Ctrl + barra de espaço é pausada e retoma a execução, e quando você clica na seta para baixo, ele é fechado. O programa pode ser visto através do console usando o comando tasklist e, se necessário, você pode descobrir seu PID para fechá-lo através do skillkill.
Eu mesmo não entendo completamente o código do programa, portanto não haverá comentários.
Na verdade, o próprio código:
#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. }
O código não é limpo de comentários desnecessários e outros tipos de lixo pela simples razão de que pode ser útil para alguém entender. Infelizmente, não consigo anexar o arquivo executável para os preguiçosos.
Gostaria de observar que não recomendo o uso deste programa para ninguém e não correrei o risco de usá-lo. Afinal, se você simplesmente cochilava no local de trabalho, isso pode ser explicado referindo-se a problemas de saúde, a uma longa ausência de férias ou a qualquer outra coisa. E se alguém entender que você está tentando enganá-lo, já será ruim, ofensivo e desagradável. E é improvável que tenha um efeito positivo em sua carreira.