zoukankan      html  css  js  c++  java
  • 模拟鼠标键盘-封装函数

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

    此处的鼠标移动是通过屏幕像素换算过来的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

     

    至于怎么采集坐标嘛...看我的另一篇随笔:https://www.cnblogs.com/pta00/p/12883058.html

    稍作修改就好,其实就是把判断鼠标按下的地方加个输出,输出一下坐标。高分屏记得要设置DPI缩放。

    下面是代码,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

  • 相关阅读:
    电脑不能连接到热点
    常用网络协议
    HVV面试
    【转载】hacker术语
    渗透测试学习路线
    系统安全——可信计算
    rsync文件同步详解
    rabbitmq集群部署高可用配置
    ansible自动化部署之路笔记
    ELK-elasticsearch-6.3.2部署
  • 原文地址:https://www.cnblogs.com/pta00/p/12891516.html
Copyright © 2011-2022 走看看