源代码
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <windows.h>
#include <shellapi.h>
#include <conio.h>
using namespace std;
HHOOK g_hKeyboardHook = NULL;
HHOOK g_mouseHook = NULL;
int cnt = 0, ccnt = 0;
RECT g_lockRect;
bool g_isLocked = true;
bool ElevateToAdmin();
bool IsUserAdmin();
void PreventMinimizeMaximize();
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);
bool InstallMouseHook();
void UninstallMouseHook();
void print();
void DisableCloseButton();
void LockMouseAtCurrentPosition();
void UnlockMouse();
bool IsRunAsAdmin();
LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
BOOL InstallKeyboardHook();
void UninstallKeyboardHook();
void RunMessageLoop();
bool ElevateToAdmin() {
wchar_t szPath[MAX_PATH];
if (!GetModuleFileNameW(NULL, szPath, ARRAYSIZE(szPath)))
return false;
SHELLEXECUTEINFOW sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFOW));
sei.cbSize = sizeof(SHELLEXECUTEINFOW);
sei.lpVerb = L"runas";
sei.lpFile = szPath;
sei.hwnd = NULL;
sei.nShow = SW_NORMAL;
if (ShellExecuteExW(&sei))
return true;
return false;
}
bool IsUserAdmin() {
HANDLE hToken = NULL;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
return false;
TOKEN_ELEVATION elevation;
DWORD dwSize;
BOOL ret = false;
if (GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwSize)) {
ret = (elevation.TokenIsElevated != 0);
}
CloseHandle(hToken);
return ret;
}
void PreventMinimizeMaximize() {
HWND hwnd = GetConsoleWindow();
if (!hwnd) return;
LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
style &= ~(WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME);
SetWindowLongPtr(hwnd, GWL_STYLE, style);
HMENU hMenu = GetSystemMenu(hwnd, FALSE);
if (hMenu) {
DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND);
DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND);
DeleteMenu(hMenu, SC_RESTORE, MF_BYCOMMAND);
DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND);
DrawMenuBar(hwnd);
}
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0 && g_isLocked) {
if (wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN
|| wParam == WM_MBUTTONDOWN || wParam == WM_XBUTTONDOWN) {
cout << "阻止了鼠标点击" << endl;
return 1;
}
}
return CallNextHookEx(g_mouseHook, nCode, wParam, lParam);
}
bool InstallMouseHook() {
g_mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, GetModuleHandle(NULL), 0);
if (g_mouseHook == NULL) {
cerr << "安装鼠标钩子失败!错误代码: " << GetLastError() << endl;
return false;
}
return true;
}
void UninstallMouseHook() {
if (g_mouseHook != NULL) {
UnhookWindowsHookEx(g_mouseHook);
g_mouseHook = NULL;
}
}
void DisableCloseButton() {
HWND hwnd = GetConsoleWindow();
if (!hwnd) return;
HMENU hMenu = GetSystemMenu(hwnd, FALSE);
if (hMenu) {
DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
DrawMenuBar(hwnd);
}
}
void LockMouseAtCurrentPosition() {
POINT currentPos;
if (!GetCursorPos(¤tPos)) return;
g_lockRect.left = currentPos.x;
g_lockRect.right = currentPos.x + 1;
g_lockRect.top = currentPos.y;
g_lockRect.bottom = currentPos.y + 1;
if (!ClipCursor(&g_lockRect)) {
cerr << "锁定鼠标失败!错误代码: " << GetLastError() << endl;
}
}
void UnlockMouse() {
ClipCursor(NULL);
g_isLocked = false;
}
bool IsRunAsAdmin() {
BOOL isAdmin = FALSE;
HANDLE hToken = NULL;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
TOKEN_ELEVATION elevation;
DWORD size = sizeof(TOKEN_ELEVATION);
if (GetTokenInformation(hToken, TokenElevation, &elevation, size, &size)) {
isAdmin = elevation.TokenIsElevated;
}
CloseHandle(hToken);
}
return (isAdmin == TRUE);
}
LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
return 1;
}
return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
}
BOOL InstallKeyboardHook() {
g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, GetModuleHandle(NULL), 0);
if (g_hKeyboardHook == NULL) {
cerr << "安装键盘钩子失败!错误码:" << GetLastError() << endl;
return FALSE;
}
return TRUE;
}
void UninstallKeyboardHook() {
if (g_hKeyboardHook != NULL) {
UnhookWindowsHookEx(g_hKeyboardHook);
g_hKeyboardHook = NULL;
}
}
void RunMessageLoop() {
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void print() {
system("title 叫爸爸!");
string input;
cout << "叫100次爸爸就放过你一次!" << endl;
while (true) {
getline(cin, input);
if (input == "爸爸" || input == "dad") {
cnt++;
cout << "好!不错不错,现在叫了" << cnt << "次" << endl;
system("shutdown -a");
UninstallKeyboardHook();
UninstallMouseHook();
UnlockMouse();
system("pause");
break;
}
else {
ccnt++;
if (ccnt == 15) {
cout << "这就是代价!(键盘鼠标将被拦截,61秒后关机)" << endl;
system("shutdown -s -t 61");
InstallMouseHook();
InstallKeyboardHook();
LockMouseAtCurrentPosition();
MessageBox(NULL, "现在输入正确内容即可解除锁定并取消关机", "警告", MB_OK);
ccnt = 0;
}
else {
MessageBox(NULL, "快点叫,不然你的电脑就完了", "警告", MB_OK);
}
}
}
}
int main(int argc, char* argv[]) {
if (!IsUserAdmin()) {
cout << "需要管理员权限,正在请求提升..." << endl;
if (ElevateToAdmin()) {
return 0;
}
else {
DWORD error = GetLastError();
if (error == ERROR_CANCELLED)
cout << "用户拒绝了权限请求。" << endl;
else
cout << "权限提升失败,错误码: " << error << endl;
return 1;
}
}
PreventMinimizeMaximize();
HWND consoleWindow = GetConsoleWindow();
ShowWindow(consoleWindow, SW_MAXIMIZE);
DisableCloseButton();
LockMouseAtCurrentPosition();
print();
UninstallKeyboardHook();
UninstallMouseHook();
UnlockMouse();
RunMessageLoop();
return 0;
}