zoukankan      html  css  js  c++  java
  • VS挂机移动鼠标代码

    #include <time.h>
    #include <stdio.h>
    #include <Windows.h>
    
    HANDLE ghMutex;
    
    ///////////////////////////////////////////////////////////////////////////////////
    /* 移动鼠标的位置(相对)
    * the amount of motion since the last mouse event was generated
    * @dx : relative x coordinate is specified as the number of pixels moved
    * @dy : relative y coordinate is specified as the number of pixels moved
    */
    int MoveMouse(LONG dx, LONG dy)
    {
        UINT ret;
        INPUT input = { 0 };
    
        input.type = INPUT_MOUSE;
        input.mi.time = 0;//the system will provide time stamp
        input.mi.dwFlags = MOUSEEVENTF_MOVE; //Movement occurred.
        input.mi.dx = dx;
        input.mi.dy = dy;
    
        //send Mouse Event
        ret = SendInput(1, &input, sizeof(INPUT));
        if (ret != 1) {
            printf("SendInput failed, %ld
    ", GetLastError());
            return -1;
        }
    
        //Assumes the mouse sampling rate is 8ms
        Sleep(8);
    
        return 0;
    }
    //////////////////////////////////////////////////////////////////////////////////////
    enum MouseButtonType {
        BUTTON_LEFT,    //鼠标左键
        BUTTON_RIGHT,    //鼠标右键
        BUTTON_MID        //鼠标中键(滚轮)
    };
    
    enum MouseClickType {
        BUTTON_PRESS,    //按键压下
        BUTTON_RELEASE,  //按键抬起
        BUTTON_CLICK    //按键点击(压下后抬起)
    };
    
    int ClickMouse(MouseButtonType ButtonType, MouseClickType ClickType)
    {
        UINT ret;
        UINT count = 2;
        INPUT input[2] = { 0 };
    
        struct MouseOperArr {
            MouseButtonType button;
            struct MouseEvtFlg {
                UINT flgCnt;
                DWORD dwFlags[2];
            }flags[3];
        } MouseEvtArr[3] = {
            { BUTTON_LEFT, { { 1, { MOUSEEVENTF_LEFTDOWN, 0 } }, 
            {1, { MOUSEEVENTF_LEFTUP, 0 }}, {2, { MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP } } } },
            { BUTTON_RIGHT, { { 1, { MOUSEEVENTF_RIGHTDOWN, 0 } }, 
            {1, { MOUSEEVENTF_RIGHTUP, 0 }}, { 2, { MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP } } } },
            { BUTTON_MID, { { 1, { MOUSEEVENTF_MIDDLEDOWN, 0 } }, 
            {1, { MOUSEEVENTF_MIDDLEUP, 0 }}, { 2,{ MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_MIDDLEUP } } } }
        };
    
        //common data
        input[0].type = INPUT_MOUSE;
        input[0].mi.time = 0;//the system will provide time stamp
        input[1].type = INPUT_MOUSE;
        input[1].mi.time = 0;//the system will provide time stamp
    
        count = MouseEvtArr[ButtonType].flags[ClickType].flgCnt;
        input[0].mi.dwFlags = MouseEvtArr[ButtonType].flags[ClickType].dwFlags[0];
        input[1].mi.dwFlags = MouseEvtArr[ButtonType].flags[ClickType].dwFlags[1];
    
        //send Mouse Event
        ret = SendInput(count, input, sizeof(INPUT));
        if (ret != count) {
            printf("SendInput failed, %ld
    ", GetLastError());
            return -1;
        }
    
        //Assumes the mouse sampling rate is 8ms
        Sleep(8);
    
        return 0;
    }
    
    #define HK_ALT_F1 (1001)
    #define HK_ALT_F2 (1002)
    #define HK_ALT_F3 (1003)
    
    DWORD WINAPI ThreadEntry(LPVOID lpThreadParameter)
    {
        srand(time(NULL));
    
    
    
        while (1) {
            //wait for message to startup
            WaitForSingleObject(ghMutex, INFINITE);
    
            //压下左键不松手
    //        ClickMouse(BUTTON_LEFT, BUTTON_PRESS);
    
            int number = rand() % 10;
            int dir = (number > 5 ? 1 : -1);
            printf("Move
    ");
            MoveMouse(dir * number, dir * number);
    
            //release mutex for new message
            ReleaseMutex(ghMutex);
            Sleep(2000);
        }
    
        return 0;
    }
    
    
    int main(void)
    {
        //注册热键 Alt + F1,用于启动程序
        RegisterHotKey(NULL, HK_ALT_F1, MOD_ALT | MOD_NOREPEAT, VK_F1);
        //注册热键 Alt + F2,用于暂停程序
        RegisterHotKey(NULL, HK_ALT_F2, MOD_ALT | MOD_NOREPEAT, VK_F2);
        //注册热键 Alt + F2,用于退出程序
        RegisterHotKey(NULL, HK_ALT_F3, MOD_ALT | MOD_NOREPEAT, VK_F3);
    
    
        ghMutex = CreateMutex(NULL, FALSE, NULL);
        WaitForSingleObject(ghMutex, INFINITE);
    
        //创建工作线程
        HANDLE handle = CreateThread(NULL, 0, ThreadEntry, NULL, 0, NULL);
    
        //主线程 用于接收热键消息
        MSG msg = { 0 };
        while (GetMessage(&msg, NULL, 0, 0)) {
            switch (msg.message) {
            case WM_HOTKEY:
                switch (msg.wParam) {
                case HK_ALT_F1://接收到ALT + F1
                    ReleaseMutex(ghMutex);
                    break;
                case HK_ALT_F2://接收到ALT + F2
                    WaitForSingleObject(ghMutex, INFINITE);
                    break;
                case HK_ALT_F3:
                    goto FINISH;
                    break;
                default:
                    break;
                }
                break;
            case WM_QUIT:
            case WM_CLOSE:
                goto FINISH;
                break;
            default:
                break;
    
            }
        }
    FINISH:
        CloseHandle(ghMutex);
        UnregisterHotKey(NULL, HK_ALT_F1);
        UnregisterHotKey(NULL, HK_ALT_F2);
        UnregisterHotKey(NULL, HK_ALT_F3);
    
        //close worker thread
        TerminateThread(handle, 0);
        WaitForSingleObject(handle, INFINITE);
        CloseHandle(handle);
    
        return 0;
    }
  • 相关阅读:
    深入Java类加载全流程,值得你收藏
    如何用好Go的测试黑科技
    Go的内存对齐和指针运算详解和实践
    Go和Java的性能对比,真的如此吗?
    Go中锁的那些姿势,估计你不知道
    浅谈Go类型转换之间的那些事
    学堂在线课程字幕下载
    无序数组中求最大值和最小值的最少比较次数
    串口字符串-HEX格式
    个人程序命名规范
  • 原文地址:https://www.cnblogs.com/LubinLew/p/Guaji.html
Copyright © 2011-2022 走看看