自动锁洛谷代码

· · 个人记录

自动锁洛谷也失效了(而且对于键盘会判断错),于是便在之前的基础上做了一个更好的

#pragma once
#include <stdio.h>
#include <io.h>
#include <string>
#include <conio.h>
#include <iostream>
#include <windows.h>
#include <bits/stdc++.h>

#define isKeyDown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //判断某个按键是否按下

using namespace std;
int wtime=0;

inline void swap(char &a,char &b) {char t=a;a=b;b=t;}

char cmd[210]="start https://www.luogu.org/api/auth/lock?uid=";

void loadUid(int uid)
{
    char st[210];
    int len=0;
    while(uid>0)
    {
        st[++len]=(uid%10)+'0';
        uid/=10;
    }
    for(int i=1;i<=len/2+1;i++)
        swap(st[i],st[len-i+1]);
    strcat(cmd,st+1);
}

void lock(int uid)
{
    printf("%s\n",cmd);
    system(cmd);
}

void help()
{
    printf("/***********************************\n");
    printf("Author:@Zimo [email protected]\n");
    printf("此程序将会在鼠标、键盘没有操作一段时间后自动锁定洛谷。\n");
    printf("直到再次按下键盘/移动鼠标后才重新判断鼠标、键盘状态。\n");
    printf("***********************************/\n");
}

bool equ(POINT a,POINT b) {return a.x!=b.x || a.y!=b.y;}

bool keyboardHit()
{
    return isKeyDown(VK_LBUTTON)||isKeyDown(VK_RBUTTON)||isKeyDown(VK_CANCEL)||isKeyDown(VK_MBUTTON)||isKeyDown(VK_BACK)||isKeyDown(VK_TAB)||isKeyDown(VK_RETURN)||isKeyDown(VK_SHIFT)||isKeyDown(VK_CONTROL)||isKeyDown(VK_MENU)||isKeyDown(VK_PAUSE)||isKeyDown(VK_CAPITAL)||isKeyDown(VK_ESCAPE)||isKeyDown(VK_SPACE)||isKeyDown(VK_PRIOR)||isKeyDown(VK_NEXT)||isKeyDown(VK_END)||isKeyDown(VK_HOME)||isKeyDown(VK_LEFT)||isKeyDown(VK_UP)||isKeyDown(VK_RIGHT)||isKeyDown(VK_DOWN)||isKeyDown(VK_SNAPSHOT)||isKeyDown(VK_INSERT)||isKeyDown(VK_DELETE)||isKeyDown(VK_LWIN)||isKeyDown(VK_RWIN)||isKeyDown(VK_APPS)||isKeyDown(VK_NUMPAD0)||isKeyDown(VK_NUMPAD1)||isKeyDown(VK_NUMPAD2)||isKeyDown(VK_NUMPAD3)||isKeyDown(VK_NUMPAD4)||isKeyDown(VK_NUMPAD5)||isKeyDown(VK_NUMPAD6)||isKeyDown(VK_NUMPAD7)||isKeyDown(VK_NUMPAD8)||isKeyDown(VK_NUMPAD9)||isKeyDown(VK_F1)||isKeyDown(VK_F2)||isKeyDown(VK_F3)||isKeyDown(VK_F4)||isKeyDown(VK_F5)||isKeyDown(VK_F6)||isKeyDown(VK_F7)||isKeyDown(VK_F8)||isKeyDown(VK_F9)||isKeyDown(VK_F10)||isKeyDown(VK_F11)||isKeyDown(VK_F12)||isKeyDown(VK_F13)||isKeyDown(VK_F14)||isKeyDown(VK_F15)||isKeyDown(VK_F16)||isKeyDown(VK_F17)||isKeyDown(VK_F18)||isKeyDown(VK_F19)||isKeyDown(VK_F20)||isKeyDown(VK_F21)||isKeyDown(VK_F22)||isKeyDown(VK_F23)||isKeyDown(VK_F24)||isKeyDown(VK_NUMLOCK)||isKeyDown(VK_SCROLL);
}

int main()
{
    help();
inuid:
    printf("\n请输入User ID:");
    char ls[110];
    scanf("%s",ls+1);
    int len=strlen(ls+1);
    int uid=0,d=1;
    for(int i=len;i>=1;i--)
        if(ls[i]>'9' || ls[i]<'0')
        {
            printf("格式有误,请重新输入。");
            goto inuid; 
        }
        else
            uid+=(ls[i]-'0')*d,d*=10;
    loadUid(uid);
inwtime:
    printf("\n请输入等待时间(正整数,单位ms):");
    scanf("%s",ls+1);
    len=strlen(ls+1);
    wtime=0;
    d=1;
    for(int i=len;i>=1;i--)
        if(ls[i]>'9' || ls[i]<'0')
        {
            printf("格式有误,请重新输入。");
            goto inwtime;
        }
        else
            wtime+=d*(ls[i]-'0'),d*=10;
    printf("\n是否要隐藏此窗口? (Y/n)");
    char hh=getche();
    printf("\n");
    if(hh=='y' || hh=='Y')
    {
        HWND hwnd=::GetForegroundWindow();
        MoveWindow(hwnd,0,0,0,0,true);
    }
    while(1)
    {
        while(1)
        {
            int st=clock();
            bool bk=true;
            POINT cst;GetCursorPos(&cst);
            while(clock()-st<=wtime)
            {
                if(keyboardHit())
                {
                    bk=false;
                    break;
                }
                POINT hh;
                GetCursorPos(&hh);
                if(equ(hh,cst))
                {
                    bk=false;
                    break;
                }
            }
            if(bk==true)
            {
                lock(uid);
                break;
            }
        }
        POINT cst;GetCursorPos(&cst);
        while(1)
        {
            if(keyboardHit()) break;
            POINT hh;GetCursorPos(&hh);
            if(equ(hh,cst)) break;
        }
    }
    return 0;
}