下午好,亲爱的。 我想分享我的故事和一点生活技巧。
我认为所有上班族都会遇到这样的情况,在午餐后,他们非常疲倦,想小睡一下。 实际上,白天睡眠对于身体和工作都非常有用,因为它对生产力有非常积极的影响。 但是,以我的经验,超过20分钟是一次破产。 这足以使身体正常化。 片刻之后,我真的想继续睡眠,片刻之后,身体醒来,您感到精力旺盛,体力激增。
另一方面,许多人更喜欢喝咖啡。 尽管这似乎有所帮助,但实际上,身体并不能恢复其资源,而只会损失更多。 是的,这是有害的。
一般来说,这很清楚,对吧? 但是,自然会产生一个问题,就是如何在办公室里解决这个问题。 问题是大多数老板都不赞成这一点。 而且沙发到处都不是。 是的,如果您珍视工作场所,则不太可能小睡一下。
但是,我很幸运,我的椅子可以向后倾斜很多,我只是想着就可以看起来正常工作。 如果不是一件事,一切都会很好。
显示器上的绝对静态图片将内脏弄出我来了!
我以某种方式与朋友分享了这个问题,他开玩笑地提出要制作一个工作模拟器。
但是,我真的很喜欢这个想法,以实现一个完整的工作模拟器-它应该是什么? 这是什么,可以为我工作吗? 通常,很明显,创建它非常困难。 但是可以简化任务。
从职业上来说,我是一个简单的C ++程序员,因此经常在Internet上爬网并阅读各种文章。 没有这个,他们都明白。
如果观察到一个人阅读冗长而复杂的文章,您会发现他会定期上下滚动文章。 这就是我决定实施的。
经过一个小时的上网浏览,将三篇文章(没有窗口的隐藏应用程序中的文章,捕获键盘事件和模拟鼠标事件的文章)的内容结合起来,实现了一个简单的程序,我想与人分享。
这个想法的核心很简单:随机鼠标滚轮滚动事件。 也就是说,您只需为当前任务选择一篇更真实,更复杂的文章,打开模拟器,然后平静地入睡。 该程序在任务管理器中不可见(或者我只是盲目而未在其中找到),使用组合键Ctrl +空格键已暂停,并恢复执行,当您单击向下箭头时,它将关闭。 可以使用tasklist命令在控制台中看到该程序,如果需要,您可以找到它的PID以通过taskkill将其关闭。
我本人并不完全了解程序代码,因此不会有任何注释。
实际上,代码本身是:
#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. }
由于某些人可能会很方便的简单原因,因此无法清除代码中不必要的注释和其他垃圾。 不幸的是,我无法为懒惰附加可执行文件。
我想指出,我不建议任何人使用该程序,我自己也不会冒险使用它。 毕竟,如果您只是在工作场所打do睡,这可以用健康不良,长期休假或其他原因来解释。 如果有人知道您要欺骗他,那将已经很糟糕,令人反感且令人不快。 而且这不太可能对您的职业产生积极影响。