精华内容
下载资源
问答
  • windows键盘模拟右键
    千次阅读
    2022-03-27 09:39:11

    在开发一些类似于向日葵或者VNC的远程桌面或者远控软件的时候,我们往往需要模拟键盘操作模拟鼠标操作。通过模拟操作,我们可以在不安装硬件外设的时候实现对电脑的控制。这里介绍一下在Windows和Linux平台下模拟鼠标键盘的实现方式,希望对有相关开发需求的人有帮助。

    Windows模拟鼠标键盘操作

    在windows下我们可以通过调用对应的windowsAPI实现对应的键盘鼠标操作模拟

    模拟键盘操作

    组合键的发送方式

    #include <Windows.h>
    //模拟键盘发送Ctrl+V贴操作
    void SendCtrlV()
    {
        // Create a generic keyboard event structure
        INPUT ip;
        ip.type = INPUT_KEYBOARD;
        ip.ki.wScan = 0;
        ip.ki.time = 0;
        ip.ki.dwExtraInfo = 0;
    
        // Press the "Ctrl" key
        ip.ki.wVk = VK_CONTROL;
        ip.ki.dwFlags = 0; // 0 for key press
        SendInput(1, &ip, sizeof(INPUT));
    
        // Press the "V" key
        ip.ki.wVk = 'V';
        ip.ki.dwFlags = 0; // 0 for key press
        SendInput(1, &ip, sizeof(INPUT));
    
        // Release the "V" key
        ip.ki.wVk = 'V';
        ip.ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, &ip, sizeof(INPUT));
    
        // Release the "Ctrl" key
        ip.ki.wVk = VK_CONTROL;
        ip.ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, &ip, sizeof(INPUT));
    }

    单键的发送方式

    #include <Windows.h>
    //模拟键盘发送单个的V按键
    void SendCtrlV()
    {
        // Create a generic keyboard event structure
        INPUT ip;
        ip.type = INPUT_KEYBOARD;
        ip.ki.wScan = 0;
        ip.ki.time = 0;
        ip.ki.dwExtraInfo = 0;
        
        // Press the "V" key
        ip.ki.wVk = 'V';
        ip.ki.dwFlags = 0; // 0 for key press
        SendInput(1, &ip, sizeof(INPUT));
    
        // Release the "V" key
        ip.ki.wVk = 'V';
        ip.ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, &ip, sizeof(INPUT));
    }

    常用的物理按键的值列表如下:

    #define VK_SHIFT          0x10  //Shift键
    #define VK_CONTROL        0x11  //Ctrl键
    #define VK_MENU           0x12  //Alt键
    #define VK_CAPITAL        0x14  //CapsLock大小写转换键 
    #define VK_RETURN         0x0D  //Enter回车键
    #define VK_ESCAPE         0x1B  //ESC键
    #define VK_SPACE          0x20  //空格键
    #define VK_PRIOR          0x21  //PageUp键
    #define VK_NEXT           0x22  //PageDown键
    #define VK_END            0x23  //End键
    #define VK_HOME           0x24  //Home键
    #define VK_TAB            0x09   //Tab 键
    #define VK_MULTIPLY       0x6A  //乘
    #define VK_ADD            0x6B  //加
    #define VK_SEPARATOR      0x6C  //除
    #define VK_SUBTRACT       0x6D  //减
    #define VK_DECIMAL        0x6E  //小数点
    #define VK_SNAPSHOT       0x2C  //Print Screen 键
    #define VK_INSERT         0x2D  //Insert键
    #define VK_DELETE         0x2E  //Delete键
    #define VK_LBUTTON        0x01  //鼠标左键
    #define VK_RBUTTON        0x02  //鼠标右键 
    #define VK_MBUTTON        0x04  //鼠标中键
    #define VK_F1             0x70  //功能键F1-F24
    #define VK_F2             0x71
    #define VK_F3             0x72
    #define VK_F4             0x73
    #define VK_F5             0x74
    #define VK_F6             0x75
    #define VK_F7             0x76
    #define VK_F8             0x77
    #define VK_F9             0x78
    #define VK_F10            0x79
    #define VK_F11            0x7A
    #define VK_F12            0x7B
    0~9可以直接使用ASCII字符表示 '0'~'9'
    a-z/A-Z也可以直接 'a'~'z' 'A'~'Z'表示

    模拟鼠标移动和点击需要使用mouse_event函数

    VOID mouse_event(
      DWORD     dwFlags,     //移动和点击的标志位
      DWORD     dx,          //水平位置
      DWORD     dy,          //垂直位置
      DWORD     dwData,      //滚轮位移
      ULONG_PTR dwExtraInfo  //应用定义的信息
    );
    
    //dwFlags常用标志信息
    MOUSEEVENTF_MOVE = 0x0001;        //移动鼠标
    MOUSEEVENTF_LEFTDOWN = 0x0002;   //模拟鼠标左键按下
    MOUSEEVENTF_LEFTUP = 0x0004;     //模拟鼠标左键抬起
    MOUSEEVENTF_RIGHTDOWN = 0x0008;  //模拟鼠标右键按下
    MOUSEEVENTF_RIGHTUP = 0x0010;    //模拟鼠标右键抬起
    MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下
    MOUSEEVENTF_MIDDLEUP = 0x0040;   //模拟鼠标中键抬起
    MOUSEEVENTF_ABSOLUTE = 0x8000;   //标示是否采用绝对坐标
    //模拟将鼠标移动到x,y位置
    void mouse_move(int x,int y)
    {
    	mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
    }
    
    //模拟鼠标移动到x,y位置并进行左键点击
    void mouse_move_and_left_click(int x,int y)
    {
    	mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
    	mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    
    //模拟鼠标移动到x,y位置并进行右键点击
    void mouse_move_and_right_click(int x,int y)
    {
    	mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
    	mouse_event(MOUSEEVENTF_RIGHTDOWN|MOUSEEVENTF_RIGHTUP,0,0,0,0);
    }
    
    //模拟鼠标移动到x,y并双击
    void mouse_move_and_double_left_click(int x,int y)
    {
    	mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
    	mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);
    	mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);
    }

    Linux模拟键盘鼠标操作

    在Linux下我们可以使用libXtst模拟鼠标键盘操作,通过模拟鼠标键盘操作我们可以实现自动化测试。

    如果系统里面没有libXtst库,我们可以通过下面的命令进行安装

    sudo apt update
    sudo apt install libxtst-dev

    系统安装之后我们就可以使用libXtst库了,如果是Qt工程可以通过下面的配置引入Xtst库

    LIBS += -lXtst 

    如果是CMake项目我们可以通过下面的命令引入Xtst库

    LINK_LIBRARIES(Xtst)

    引入了对应的库之后我们就可以在代码中模拟键盘鼠标操作了

    键盘操作

    模拟单一的按键操作

    #include <X11/extensions/XTest.h>
    #include <X11/Xlib.h>
    #include <X11/keysymdef.h>
    
    int SimulateSingleKey()
    {
        Display* disp = XOpenDisplay(NULL);
        if(disp == NULL)
        {
            return 0;
        }   
        //模拟键盘上的A键的点击                                   
        XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_A), True, CurrentTime);
        XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_A), False, CurrentTime);
    
        XCloseDisplay(disp);
        return 1;
    }

    模拟组合键的操作

    #include <X11/extensions/XTest.h>
    #include <X11/Xlib.h>
    #include <X11/keysymdef.h>
    void simulateMultiKey()
    {
        Display* disp = XOpenDisplay(NULL);
        if(disp == NULL)
        {
            return;
        }
        //模拟Ctrl+A的组合键操作
        int ctrl_value = XK_Control_L;
        int key_value = XK_A;
        KeyCode keycode = 0, modcode = 0;
    
        keycode = XKeysymToKeycode (disp, key_value);
        if (keycode == 0) return;
        XTestGrabControl (disp, True);
       
         //保持Ctrl键
        if (ctrl_value != 0)
        {
            modcode = XKeysymToKeycode(disp, ctrl_value);
            XTestFakeKeyEvent (disp, modcode, True, 0);
        }
    
        //模拟A键按下
        XTestFakeKeyEvent (disp, keycode, True, 0);
        XTestFakeKeyEvent (disp, keycode, False, 0);
    
        //释放Ctrl键
        if (ctrl_value != 0)
            XTestFakeKeyEvent (disp, modcode, False, 0);
    
        XSync (disp, False);
        XTestGrabControl (disp, False);
    
        XCloseDisplay(disp);
    }

    Xtst中常用的物理按键的值列表如下:

    #define XK_Shift_L                       0xffe1  //左Shift
    #define XK_Shift_R                       0xffe2  //右Shift
    #define XK_Control_L                     0xffe3  //左Ctrl
    #define XK_Control_R                     0xffe4  //右Ctrl
    #define XK_Caps_Lock                     0xffe5  //CapsLock
    #define XK_Shift_Lock                    0xffe6  //ShiftLock
    #define XK_Alt_L                         0xffe9  //左Alt
    #define XK_Alt_R                         0xffea  //右Alt
    #define XK_Meta_L                        0xffe7  //左Windows键
    #define XK_Meta_R                        0xffe8  //右windows键
    #define XK_BackSpace                     0xff08  //backspace键
    #define XK_Tab                           0xff09  //tab键
    #define XK_Return                        0xff0d  //回车换行
    #define XK_Escape                        0xff1b  //ESC键
    #define XK_space                         0x0020  //空格键
    #define XK_plus                          0x002b  //加   
    #define XK_minus                         0x002d  //减
    #define XK_multiply                      0x00d7  //乘 
    #define XK_A                             0x0041  
    #define XK_B                             0x0042  
    #define XK_C                             0x0043  
    #define XK_D                             0x0044  
    #define XK_E                             0x0045  
    #define XK_F                             0x0046  
    #define XK_G                             0x0047  
    #define XK_H                             0x0048  
    #define XK_I                             0x0049  
    #define XK_J                             0x004a  
    #define XK_K                             0x004b  
    #define XK_L                             0x004c  
    #define XK_M                             0x004d  
    #define XK_N                             0x004e  
    #define XK_O                             0x004f  
    #define XK_P                             0x0050  
    #define XK_Q                             0x0051  
    #define XK_R                             0x0052  
    #define XK_S                             0x0053  
    #define XK_T                             0x0054  
    #define XK_U                             0x0055  
    #define XK_V                             0x0056  
    #define XK_W                             0x0057  
    #define XK_X                             0x0058  
    #define XK_Y                             0x0059  
    #define XK_Z                             0x005a  
    #define XK_0                             0x0030  
    #define XK_1                             0x0031  
    #define XK_2                             0x0032  
    #define XK_3                             0x0033  
    #define XK_4                             0x0034  
    #define XK_5                             0x0035  
    #define XK_6                             0x0036  
    #define XK_7                             0x0037  
    #define XK_8                             0x0038  
    #define XK_9                             0x0039  
    #define XK_F1                            0xffbe
    #define XK_F2                            0xffbf
    #define XK_F3                            0xffc0
    #define XK_F4                            0xffc1
    #define XK_F5                            0xffc2
    #define XK_F6                            0xffc3
    #define XK_F7                            0xffc4
    #define XK_F8                            0xffc5
    #define XK_F9                            0xffc6
    #define XK_F10                           0xffc7
    #define XK_F11                           0xffc8
    #define XK_F12                           0xffc9
    //更多按键参考keysymdef.h文件

    Linux下模拟鼠标移动和点击操作

    //模拟将鼠标移动到x,y位置
    void simulate_mouse_move(int x,int y)
    {
       Display* disp = XOpenDisplay(NULL);
        if(disp == NULL)
        {
            return;
        }
        XTestGrabControl(disp, True);
       XTestFakeMotionEvent(disp, 0, x, y, CurrentTime);
       XTestGrabControl(disp, False);
       XFlush(disp);
       XCloseDisplay(disp); 
    }
    //模拟将鼠标移动到x,y位置然后点击鼠标按键
    void simulate_mouse_move_and_click(int x,int y)
    {
       Display* disp = XOpenDisplay(NULL);
        if(disp == NULL)
        {
            return;
        }
        XTestGrabControl(disp, True);
        //鼠标移动
       XTestFakeMotionEvent(disp, 0, x, y, CurrentTime);
       //鼠标模拟按键
       //@1:屏幕的指针
       //@2:按键类型:1(鼠标左键) 3(鼠标右键) 2(鼠标中键)
       //4(滚轮正方向滚动) 5(滚轮反方向滚动)
       //@3操作的标志位:true(按键按下) false(按键抬起)
       //@4操作延时,设置成0就行
       XTestFakeButtonEvent(disp,  1, true, CurrentTime);
       XTestGrabControl(disp, False);
       XFlush(disp);
       XCloseDisplay(disp); 
    }

    通过采用Xtst库我们就可以实现各种鼠标键盘操作的模拟了。通过物理操作的模拟可以实现远控和自动化测试等之前无法实现的功能了。

    更多相关内容
  • vs2013 c++ hook实现屏蔽键盘win,fn,右键按键
  • Java提供了一个很好的自动化测试类供我们去模拟鼠标键盘消息。以下是Robot的主要方法Robot类的主要方法详细信息1、mouseMove(intx,inty)将鼠标指针移动到给定屏幕坐标;2、mousePress(intbuttons)按下一个或多个鼠标...

    Java提供了一个很好的自动化测试类供我们去模拟鼠标键盘消息。以下是Robot的主要方法

    Robot类的主要方法详细信息

    1、mouseMove(int x,int y)将鼠标指针移动到给定屏幕坐标;

    2、mousePress(int buttons)按下一个或多个鼠标按钮。使用mouseRelease(intbuttons)方法释放鼠标按钮;

    3、mouseWheel(int wheelAmt)在配有滚轮的鼠标上旋转滚轮。参数wheelAmt是移动鼠标滚轮的”刻痕“数,负值表示向上/远离用户的运动,正值表示向下/接近用户的运动。

    4、keyPress(int keycode)按下给定的键。应该使用keyRelease方法释放该键。 拥有一个以上与之相关的物理键(例如,KeyEvent.VK_SHIFT可能指左shift键或右shift键)的键代码可能映射到左键。

    5、keyRelease(int keycode)释放给定的键。拥有一个以上与之相关的物理键(例如,KeyEvent.VK_SHIFT可能指左shift键或右shift键)的键代码可能映射到左键。

    6、delay(int ms)睡眠指定的时间。为了捕获发生的所有InterruptedException,可以使用Thread.sleep()替代。

    7、createScreenCapture(Rectangle screenRect)创建包含从屏幕中读取的像素的图像。该图像不包括鼠标光标。

    例子:是产生两个按钮,模拟在按钮上按下左键或者右键import java.awt.AWTException;

    import java.awt.EventQueue;

    import java.awt.GridLayout;

    import java.awt.MouseInfo;

    import java.awt.Point;

    import java.awt.Robot;

    import java.awt.event.InputEvent;

    import java.awt.event.MouseAdapter;

    import java.awt.event.MouseEvent;

    import javax.swing.JButton;

    import javax.swing.JFrame;

    import org.omg.CORBA.PUBLIC_MEMBER;

    public class Test extends JFrame {

    private JButton btn1 = new JButton("按钮_1");

    private JButton btn2 = new JButton("按钮_2");

    private Robot robot;

    public Test(){

    this.setLayout(new GridLayout(0,1));

    this.add(btn1);

    this.add(btn2);

    btn1.addMouseListener(new MouseAdapter() {

    public void mouseClicked(MouseEvent e){

    if(e.getButton() == MouseEvent.BUTTON1)

    System.out.println("按钮1鼠标左键被按下!");

    if(e.getButton() == MouseEvent.BUTTON3)

    System.out.println("按钮1鼠标右键被按下!");

    }

    });

    btn2.addMouseListener(new MouseAdapter() {

    public void mouseClicked(MouseEvent e){

    if(e.getButton() == MouseEvent.BUTTON1)

    System.out.println("按钮2鼠标左键被按下!");

    if(e.getButton() == MouseEvent.BUTTON3)

    System.out.println("按钮2鼠标右键被按下!");

    }

    });

    }

    public void testMoni(){

    try {

    robot = new Robot();

    robot.delay(1000);//延迟一秒

    robot.mouseMove(100, 50);//移动到按钮的所在位置

    robot.mousePress(InputEvent.BUTTON1_MASK);//按下左键

    robot.mouseRelease(InputEvent.BUTTON1_MASK);//松开左键

    /**

    *  robot.mouseMove(100, 50);//移动到按钮的所在位置

    robot.mousePress(InputEvent.BUTTON1_MASK);//按下右键

    robot.mouseRelease(InputEvent.BUTTON1_MASK);//松开右键

    */

    } catch (AWTException e) {

    e.printStackTrace();

    }

    }

    public static void main(String  args[]){

    EventQueue.invokeLater(new Runnable(){

    @Override

    public void run() {

    Test frame = new Test();

    frame.setSize(400, 400);

    frame.setVisible(true);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.testMoni();

    }

    });

    }

    }

    运行结果:

    dc0657a10fd6818cb92a869f4a6ead5c.png

    展开全文
  • 模拟键盘 from pykeyboard import * k = PyKeyboard() k.type_string(u'杀毒防御') # 我靠不能输入中文啊。。。 k.press_key('H') # 模拟键盘按H键 k.release_key('H') # 模拟键盘松开H键 k.tap_key('H') # 模拟...

    本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗。

    依赖:

    pip install PyUserInput

    PyUserInput 依赖 pyhook,所以还得安装 pyhook。按需下载,下载地址。

    我是 win10 64 位 python 2.7,用的是第二个,下载之后用解压软件打开,把 pyHook放到C:\Python27\Lib\site-packages\pyHook下即可。

    环境有了,看一下代码。

    模拟鼠标

    from pymouse import *

    m = PyMouse()

    m.click(1806, 14)

    m.click(x,y,button,n) #鼠标点击

    #x,y #是坐标位置

    #button #1表示左键,2表示点击右键

    #n –点击次数,默认是1次,2表示双击

    m.click(577, 490, 1)

    比较简单,看一下鼠标事件监控:

    class Clickonacci(PyMouseEvent):

    def __init__(self):

    PyMouseEvent.__init__(self)

    def click(self, x, y, button, press):

    print(time.time(), button, press)

    c = Clickonacci()

    c.run()

    这里要注意是阻塞线程的。

    模拟键盘

    from pykeyboard import *

    k = PyKeyboard()

    k.type_string(u'杀毒防御') # 我靠不能输入中文啊。。。

    k.press_key('H') # 模拟键盘按H键

    k.release_key('H') # 模拟键盘松开H键

    k.tap_key('H') # 模拟点击H键

    k.tap_key('H', n=2, interval=5) # 模拟点击H键,2次,每次间隔5秒

    k.tap_key(k.function_keys[5]) # 点击功能键F5

    #组合键模拟

    #例如同时按alt+tab键盘

    k.press_key(k.alt_key) # 按住alt键

    k.tap_key(k.tab_key) # 点击tab键

    k.release_key(k.alt_key) # 松开alt键

    键盘事件监听:

    class TapRecord(PyKeyboardEvent):

    def __init__(self):

    PyKeyboardEvent.__init__(self)

    def tap(self, keycode, character, press):

    print(time.time(), keycode, character, press)

    t = TapRecord()

    t.run()

    嗯,本来我是想整点东西的,但后来发现 360 太猛了,对360的窗口都无效,其他倒是不影响。毕竟是做安全的公司,如果有效的话,可以在运行真实代码前把360给关了,这样就能为所欲为了。我只是想模拟一下限制网速而已。。。。太猛了。搞了很久,一点办法都没有。

    上一张监听键盘的效果图:

    不要干坏事哦。。。欢迎赞赏。

    展开全文
  • 对于键盘模拟,以Caps Lock Click为例: 图 WinDbg查看Caps Lock按键过程中KEYBOARD_INPUT_DATA结构中每个变量的值。 图 根据获取的KEYBOARD_INPUT_DATA的值构造KeyboardClassServiceCallback函数的参数,...

    Reference

    获取KeyboardClassServiceCallback函数的地址

    SendMessage/PostMessage

    是Ring3层的一种方法,SendMessage和PostMessage是User32.dll中的函数。可以直接在程序中调用,实现对另一个软件上的按钮的点击。发消息给固定HWND的窗口,不需要窗口是处于顶层。代码:

    db6e1fd41f2b49c291ccdcd9c284fd0b.001.1453801642.png

    SendInput

    这个函数发消息给Active window, 发消息之前需要将窗口置顶,主要使用结构体INPUT, 头文件#include

    db6e1fd41f2b49c291ccdcd9c284fd0b.002.1453801642.png

    这个结构是一个联合体,可以发送KEYBOARD和MOUSE两种事件。MOUSE事件的结构体如下:

    db6e1fd41f2b49c291ccdcd9c284fd0b.003.1453801642.png

    代码:

    db6e1fd41f2b49c291ccdcd9c284fd0b.004.1453801642.png

    keybd_event/mouse_event

    这两个函数头文件include,代码:

    db6e1fd41f2b49c291ccdcd9c284fd0b.005.1453801642.png

    图 在MFC程序中,可以直接使用keybd_event和mouse_event这两个函数。

    这两个函数keybd_event和mouse_event内部是调用SendInput函数实现的,所以消息是发给Active window的。所以,使用这两个函数发消息给窗口的时候,同样需要将窗口程序置顶。

    db6e1fd41f2b49c291ccdcd9c284fd0b.006.1453801643.png

    图 mouse_event 内部实际是条用SendInput函数实现的。

    db6e1fd41f2b49c291ccdcd9c284fd0b.007.1453801643.png

    图 keybd_event内部实际是调用SendInput函数实现的。

    Kbdclass.sys-KeyboardClassServiceCallback/mouclass.sys-MouseClassServiceCallback

    这个是底层的键盘鼠标事件回调函数。通过直接调用这两个函数可以实现模拟键盘鼠标输入的效果。代码是从看雪上下载的代码的基础上修改实现的。

    主要思想:

    1、找到KeyboardClassServiceCallback/MouseClassServiceCallback函数在内核中的地址,采用特征码搜索的方法;

    使用ZwQuerySystemInformation函数,其参数为SystemModuleInformation = 11时,用于获取系统所有内核模块的相关信息,放在PSYSTEM_MODULE_INFORMATION结构体中,这个结构体中包含了模块名(module[Index].ImageName + module[Index].ModuleNameOffset),模块基址(module[Index].Base)的相关信息,这样就可以找到kbdclass.sys 和 mouclass.sys的基址。然后根据特征码搜索的方法,找到KeyboardClassServiceCallback/MouseClassServiceCallback的入口地址。

    db6e1fd41f2b49c291ccdcd9c284fd0b.008.1453801643.png

    图 获取系统内核所有模块的信息,查找需要的模块基址

    db6e1fd41f2b49c291ccdcd9c284fd0b.009.1453801643.png

    图 根据特征码搜索的方法查找内核函数的地址

    2、构造函数的参数,直接调用这两个函数实现模拟按键。

    KEYBOARD_INPUT_DATA结构在ntddkbd.h中;MOUSE_INPUT_DATA结构在ntddmou.h中。这两个头文件都在WDM的目录中可以找到。要使用这两个结构就需要将对应的头文件加入。

    但是对这两个结构体的赋值,还是需要去查一下键盘的键值,鼠标的坐标表示方式等信息。我这里没有去查这些信息,特别是对应鼠标的坐标,查了一些资料,感觉不太好确定。所以还是从逆向分析的角度,获取要模拟的事件对应的该结构的值,然后用这个值进行模拟测试。对于键盘的模拟,以Caps Lock Click为例:

    db6e1fd41f2b49c291ccdcd9c284fd0b.010.1453801643.png

    图 WinDbg查看Caps Lock按键过程中KEYBOARD_INPUT_DATA结构中每个变量的值。

    db6e1fd41f2b49c291ccdcd9c284fd0b.011.1453801643.png

    图 根据获取的KEYBOARD_INPUT_DATA的值构造KeyboardClassServiceCallback函数的参数,调用该函数实现模拟按键。

    对于鼠标的模拟,以鼠标左键Click为例:

    db6e1fd41f2b49c291ccdcd9c284fd0b.012.1453801643.png

    图 构造KeyboardClassServiceCallback函数的参数,调用该函数实现鼠标左键Click事件。

    这两个函数的调用都是在DriverEntry中直接实现的,所以最终的表现形式是:只在驱动加载的时候模拟点击一次,要实现重复多次的模拟,就需要将内核函数的调用写在IRP的分派函数中,然后在Ring3层读写驱动设备。

    遇到的问题

    1、双机调试过程中内核符号表的配置

    要了解系统内核中的函数,需要配置双机调试环境,查看内核中的实现。其中我自己觉得比较难的一点是内核符号表的配置。如果内核符号表配置不好的话,无法在WinDBG中查看内核函数与对应的数据结构。

    http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx  可以在这个地址下载对应的内核符号表,然后安装到对应的目录,如E:WindowsSymbils.然后在WinDBG的Symbol File Path目录中输入该目录E:\Windows\Symbils,.reload加载符号表。

    我这里一直加载不到符号表的问题出在了转义字符“”上。

    2、如何获取MOUSE_INPUT_DATA与KEYBOARD_INPUT_DATA参数的问题

    在MSDN上面可以查到这两个数据结构,对于参数的赋值还是需要仔细研究。我使用的方法是在系统的MouseClassServiceCallback和KeyboardClassServiceCallback函数的地址处下断点,然后获取实际按键过程中这两个数据结构的值,然后用这个数据做模拟按键。

    3、内核函数的调用方式

    这里考虑到驱动编写的过程中,是采用过滤驱动还是直接调用内核函数两种方式。过滤驱动就是在原有的驱动对象的基础上,在设备堆栈上注册自己的驱动对象,实现自己的驱动回调函数,但是过滤驱动也是在当IRP发生的时候,调用的。模拟按键的话,我认为是要绕过硬件触发,绕过IRP,直接调用底层的函数来实现对应的功能。所以,最后还是选择的是直接调用内核函数。

    4、设备对象:DEVICE_OBJECT的获取

    键盘和鼠标驱动函数MouseClassServiceCallback和KeyboardClassServiceCallback的第一个参数是DEVICE_OBJECT对象。所以,需要在调用之前创建对应的设备对象。键盘设备对象的符号名:L”\Device\KeyboardClass0”;鼠标设备对象的符号名:L”\Device\PointerClass0”;理论上这个值是跟MOUSE_INPUT_DATA与KEYBOARD_INPUT_DATA中的UintID参数对应的,但是好像没有那么严格。

    展开全文
  • 本文实例讲述了Python实现windows模拟按键和鼠标点击的方法。分享给大家供大家参考。具体如下:这段代码可以模拟在窗口上按下按键、鼠标左键点击、鼠标右键点击、鼠标双击等等## _*_ coding:UTF-8 _*_import win32...
  • 可以为 INPUT_HARDWARE 硬件输入, hi union有效 INPUT_KEYBOARD 键盘输入,ki union有效 NPUT_MOUSE 鼠标输入,mi union有效 共用体 mi 是一个包含模拟鼠标输入信息的MOUSEINPUT结构体 ki 是一个包含模拟键盘输入...
  • 以下操作可以模拟对鼠标键盘的一系列顺序操作。 1、 将内容复制到剪切板: # 将字符串text复制到剪切板 win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText('text') ...
  • ActionChains类常用于模拟鼠标的行为,比如单击,双击,右键,拖拽等行为; 关于上面介绍的模块更详细的内容,大家可以自行百度,这里主要是达到我们实现右键选择的目的。 需要导入pyautogui模块和ActionChains类...
  • 1. 安装pyperclip pip install pyperclip 使用方法 复制 pyperclip.copy("hello world") 粘贴 pyperclip.paste()... 参考资料 Python-模拟鼠标键盘动作 python3 使用pyperclip读写剪贴板(windows) github PyUserInput库
  • C/C++ Windows平台 模拟键盘 / 鼠标操作

    千次阅读 2020-01-23 20:55:39
    原理:调用Windows API 头文件: Windows.h 鼠标 按键 使用定义在Winuser.h中的mouse_event函数(Windows.h中已经包含了Winuser.h)该函数定义如下: void mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, ...
  • 本文介绍了利用Python实现Windows下的鼠标键盘模拟的实例代码,分享给大家本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗。依赖:pip install PyUserInputPyUserInput 依赖 pyhook,...
  • 今天写了点代码,功能是筛选桌面中符合某些条件的窗口,模拟鼠标键盘实现全选 → 复制 → 检测剪切板 → 判断是否存在某些敏感字符串。 大致功能是这样。下面是代码(如果不想看不相关的内容可以直接跳到底部): #...
  • C++ 模拟鼠标键盘操作

    千次阅读 2022-07-30 18:13:59
    当用户在键盘上键入时,具有键盘焦点的窗口的窗口过程接收击键消息。击键消息是WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP。典型的窗口过程会忽略除WM_KEYDOWN之外的所有击键消息。当用户按下某个键时,系统...
  • 设置步骤键盘鼠标控制功能内置于Windows10中。首先进入设置窗口,此时需要按键盘上的windows键,然后输入shezih,没错,拼音就行。系统会自动匹配“设置”,此时按回车。在“设置”窗口中,先按一下tab件让下面的...
  • else if (NumKey == VK_APPS) // 键盘右键 revalue = "右键"; else if (NumKey == VK_INSERT) // 插入 revalue = "[Insert]"; else if (NumKey == VK_DELETE) // 删除 revalue = "[Delete]"; else if ...
  • windows7 键盘实现鼠标左键/右键

    千次阅读 2019-01-16 14:10:55
    当点亮NumLock键时,是数字小键盘;当点灭NumLock键时,数字小键盘的5为左键,Enter为右键
  • python 模拟键盘输入

    千次阅读 2021-01-13 22:59:55
    ’) –模拟键盘输入字符串 k.press_key(‘H’) –模拟键盘按H键 k.release_key(‘H’) –模拟键盘松开H键 k.tap_key(“H”) –模拟点击H键 k.tap_key(‘H’,n=2,interval=5) –模拟点击H键,2次,每次间隔5秒 k.tap_...
  • C#模拟鼠标操作以及键盘输入

    千次阅读 2022-01-02 22:38:27
    模拟鼠标以及键盘基本输入源代码 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace ...
  • 所有键盘鼠标模拟方式原理及实现

    千次阅读 2021-02-15 00:18:09
    有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是...
  • C/C++ 模拟键盘操作(一)

    万次阅读 多人点赞 2020-04-14 09:55:42
    玩游戏的小伙伴可能使用过按键精灵,录制一个简单的脚本就可以模拟鼠标和键盘的操作极大程度上解决你的双手了,比如你玩逆战的时候使用狙击的新手就可以使用一个简单的脚本或者宏实现连狙的效果,或者穿越火线跳箱子...
  • Python 模拟键盘鼠标操作详细教程

    千次阅读 2020-11-30 02:01:51
    这种情况下,Python也不是完全没有办法的,我们可以采用模拟键盘和鼠标的方式实现自动化。Python中模拟键盘和鼠标最著名的模块是:pymouse和pykeyboard。一次安装两个模块比较麻烦,而有一个库整合了这两个模块,...
  • 那么有没有什么办法可以让键盘鼠标自己动起来,解放我们聪明的大脑呢?有,用脚本。虽然对于键盘鼠标脚本而言,市面上已经有非常强大的软件-按键精灵。它基本可以满足任何你对键盘鼠标操作的想法,对于简单的脚本,...
  • Windows:模拟屏幕点击,按键刷票

    千次阅读 2019-02-22 21:03:14
    特定的网页模拟鼠标点击以及按键刷新,右键、左键点击,与暂停: #include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;windows.h&gt; #define KEY_DOWN(VK_NONAME) (...
  • python模拟鼠标和键盘

    万次阅读 多人点赞 2019-05-16 17:22:04
    导入pymouse和pykeyboard库,通过PyMouse和PyKeyboard类可以分别实例化鼠标和键盘对象。然后利用类中定义的相应的方法,可以模拟鼠标的移动、单击、双击操作,模拟键盘的输入、按键等操作。
  • dd虚拟键盘鼠标模拟软件是一款非常不错的虚拟键盘鼠标软件,有了这款软件用户可以一键安装添加一对可完全编程控制的鼠标键盘了,随心所欲的操作电脑,无论是工作还是游戏都是极好用的。此软件支持64位和32位系统,有...
  • 您可能感兴趣的文章:python PyAutoGUI 模拟鼠标键盘操作和截屏功能Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)利用Python实现Windows下的鼠标键盘模拟的实例代码Python捕捉和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,019
精华内容 2,807
热门标签
关键字:

windows键盘模拟右键