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\n", 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\n", 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\n");
        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;
}

 

posted @ 2016-05-21 08:55  LubinLew  阅读(933)  评论(0编辑  收藏  举报