模拟鼠标键盘-封装函数

群里有人要用到简单的鼠标键盘模拟操作,但是这方面的函数不太方便,为此打造了这个简陋的函数封装。

此处的鼠标移动是通过屏幕像素换算过来的dpi(0~65535),所以有一点点的误差,测试为1像素。

如果你用的是高分屏,那么强烈建议将程序的DPI缩放选上,将下图里的这个框勾上。

一切关于鼠标移动的和采集位置的,都建议如此设置,否则可能因为高分屏下设置的Windows缩放而导致错位。

另外,这个键盘模拟的功能键比较简陋,一次只能一个键,而且不能同时按两个键,有能力的自己改一改函数。

鼠标码值:

MOUSEEVENTF_LEFTDOWN
0x0002
按下左按钮。
MOUSEEVENTF_LEFTUP
0x0004
释放左按钮。
MOUSEEVENTF_RIGHTDOWN
0x0008
按下了右按钮。
MOUSEEVENTF_RIGHTUP
0x0010
释放了右键。
MOUSEEVENTF_MIDDLEDOWN
0x0020
按下中间按钮。
MOUSEEVENTF_MIDDLEUP
0x0040
中间按钮被释放。

键盘码值:

https://docs.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes

 

下面是代码,main里面是使用例子,使用时直接将main前面的所有东西复制到自己的程序就好。

 

#include <stdio.h>
//#include <winuser.h>//可以删掉 TDM编译器无法使用 
#include <windows.h>
#include <stdlib.h>
void sendTEXT(char *text){
    KEYBDINPUT input;
    input.dwExtraInfo=0;
    input.dwFlags=KEYEVENTF_UNICODE;
    input.time=0;
    input.wScan=0;
    input.wVk=0;
    INPUT aa;
    aa.type=INPUT_KEYBOARD;
    aa.ki=input;
    wchar_t text_utf16[256]={0};
    int n1 = MultiByteToWideChar(CP_ACP,0,text,strlen(text),text_utf16,256);
    for(int i=0;i<n1;i++){
        Sleep(100);
        input.wScan=text_utf16[i]; 
        aa.ki=input;
        SendInput(1,&aa,sizeof(INPUT));
    }
} 

void sendKI(WORD uint_ki){
    KEYBDINPUT input;
    input.dwExtraInfo=0;
    input.dwFlags=0;//KEYEVENTF_KEYUP;
    input.time=0;
    input.wScan=0;
    input.wVk=0;//必须是1到254之间的值
    INPUT aa[2];//数组是为了功能组合键
    aa[0].type=aa[1].type=INPUT_KEYBOARD;
    aa[0].ki=aa[1].ki=input;
    aa[0].ki.wVk=uint_ki;
    aa[1].ki.dwFlags=KEYEVENTF_KEYUP;
    SendInput(2,aa,sizeof(INPUT));
}

void sendMI(WORD mi){
    MOUSEINPUT input;
    input.dx=0;
    input.dy=0;
    input.dwFlags=mi;
    input.mouseData=0;
    input.time=0;
    input.dwExtraInfo=0;
    INPUT aa;
    aa.type=INPUT_MOUSE;
    aa.mi=input;
    SendInput(1,&aa,sizeof(INPUT));
}

void sendXY(WORD x,WORD y){//这种计算方式会有误差,很小很小 
    RECT rect;
    GetWindowRect(GetDesktopWindow(),&rect);
    MOUSEINPUT input;
    input.dx=x*(65535/(float)rect.right);
    input.dy=y*(65535/(float)rect.bottom);
    input.dwFlags=MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE;
    input.mouseData=0;
    input.time=0;
    input.dwExtraInfo=0;
    INPUT aa;
    aa.type=INPUT_MOUSE;
    aa.mi=input;
    SendInput(1,&aa,sizeof(INPUT));
}

int main(void){
    while(1){
        static int i=0;i++;
        char cc[200]={"刷屏代码就这?"};
        char c2[20]={""};
        Sleep(1000);
        sendTEXT(strcat(cc,itoa(i,c2,10)));
        sendKI(0x0D);//0x20空格 0x0D回车
    }
    //sendXY(200,200);//设置鼠标位置,如果出问题请设置DPI 
    //sendMI(0x0002);//0x0002左键按下 0x0004左键抬起 0x0008右键按下 0x0010右键抬起
}

如果有问题的话,点击顶部的联系,或联系我的qq:2762171125,感谢您的支持。

点击链接加入群聊【MC</>开发者团队】:https://jq.qq.com/?_wv=1027&k=Lef5I9ON

猜你喜欢

转载自www.cnblogs.com/pta00/p/12891516.html