• 网络编程keybd_event 达到远控目的


    Windows提供了一个模拟键盘操作的API函数keybd_event(),使用该函数可以模拟相应的键盘动作。keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。该函数原型如下:

     

    VOID keybd_event(

     

    BYTE bVk,                     // virtual-key code

     

    BYTE bScan,                  // hardware scan code

     

    DWORD dwFlags,         // flags specifying various function options

     

    DWORD dwExtraInfo   // additional data associated with keystroke);

     

    从原型可以看出,keybd_event ()共有四个参数:

     

    bVk:按键虚拟键值,如回车键为vk_return,Tab键为vk_tab;

     

    bScan:为扫描码,一般不用设置,用0代替就行;

     

    dwFlags:为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";

     

    dwExtraInfo:一般置0即可。

     

    // 例子1:模拟按下'A'键

     

    keybd_event(65,0,0,0);

     

    keybd_event(65,0,KEYEVENTF_KEYUP,0);

     

    // 例子2:模拟按下'ALT+F4'键

     

    keybd_event(18,0,0,0);

     

    keybd_event(115,0,0,0);

     

    keybd_event(115,0,KEYEVENTF_KEYUP,0);

     

    keybd_event(18,0,KEYEVENTF_KEYUP,0);

     

    实用例程

    模拟键盘平时不是很常用,但是当调用某些快捷键执行某项功能时,它真的是那么的方便,看看下面的实现。

     

    1. 显示桌面

     

    很多软件有显示桌面的功能,并且大家的方法都是遍历窗口,然后让它们最小化,其实Windows系统给了一个非常方便的WIN键(就是键盘上在CTRL键和ALT键之间的那个带win标志的按键)。利用它可以轻松的完成显示桌面的功能。

     

    // 显示桌面

     

    keybd_event(VK_LWIN, 0, 0 ,0);

     

    keybd_event('M', 0, 0 ,0);

     

    keybd_event('M', 0, KEYEVENTF_KEYUP ,0);

     

    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

     

    其他的操作也类似,比如直接显示“开始”的运行,就把上面的'M'换成'R'即可。

     

    // 显示开始运行

     

    keybd_event(VK_LWIN, 0, 0 ,0);

     

    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

     

    直接显示“开始”对话框了。

     

    2. 实现快速全选

     

    很多的时候,比如listctrl实现全选,你可以用listctrl循环设置每一项的状态为选中,多啰嗦的事情。用快捷键试一试CTRL+A,其他的快捷键一样的用法。

     

    keybd_event(VK_CONTROL, (BYTE)0, 0 ,0);

     

    keybd_event('A',(BYTE)0, 0 ,0); //此处可以用  'A', (BYTE)65, 用'a'不起作用.

     

    keybd_event('A', (BYTE)0, KEYEVENTF_KEYUP,0);

     

    keybd_event(VK_CONTROL, (BYTE)0, KEYEVENTF_KEYUP,0);

     

    3. 执行某些特殊键,比如数字键,大小写键

     

    bool bState=true;              // true为按下NumLock,false反之

     

    BYTE keyState[256];

     

    GetKeyboardState((LPBYTE)&keyState);

     

    if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||

     

     (!bState && (keyState[VK_NUMLOCK] & 1)) )

     

    {

     

    // Simulate a key press

     

    keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );

     

    // Simulate a key release

     

    keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

     

    }

     

    4. 实现CTRL+ALT+DELETE三键一起按下

     

    keybd_event(VK_CONTROL, 0, 0 ,0);

     

    keybd_event(VK_MENU,0, 0 ,0);

     

    keybd_event(VK_DELETE,0, 0 ,0);

     

    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

     

    keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);

     

    keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);

     

    这样不会成功,因为这几个键是操作系统直接截获执行的,而模拟键盘只能发向应用程序,所以这种方法不行的(想显示锁定对话框,用LockWorkStation();)

     

    5. Window2000/NT/XP已经不提倡用这个函数了,上面的方法只是为了让大家开阔一下思路,怎么替代?

     

    // Window2000/NT/XP下用这个代替,包含"winable.h"

     

    INPUT input[4];

     

    memset(input, 0, sizeof(input));

     

    input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;

     

    input[0].ki.wVk  = input[3].ki.wVk = VK_LWIN;

     

    input[1].ki.wVk  = input[2].ki.wVk = 'R';

     

    //接下来释放它,这一点很重要。

     

    input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;

     

    input[0].ki.time = input[1].ki.time = input[2].ki.time = input[3].ki.time = GetTickCount();

     

    SendInput(4, input, sizeof(INPUT));

     

    感觉比那个有点啰嗦。

     

    WIN键部分快捷键

    WIN键+D=快速的切到桌面,再次点击返回;

     

    WIN键+E=快速打开资源管理器;

     

    WIN键+R=“运行”;

     

    WIN键+M=全部视窗最小化;

     

    WIN键+Shift+M=取消全部视窗最小化;

     

    WIN键+F1=Help;

     

    WIN键+F=“寻找”;

     

    WIN键+Ctrl+F=显示“查找电脑”;

     

    WIN键+Tab=切换工作列的程式;

     

    WIN键+Break=显示系统内容。

     

    MOUSE_event

    private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); 

    参数 意义 
    dwFlags Long,下表中标志之一或它们的组合 
    dx,dy Long,根据MOUSEEVENTF_ABSOLUTE标志,指定x,y方向的绝对位置或相对位置 
    cButtons Long,没有使用 
    dwExtraInfo Long,没有使用 

    dwFlags常数 意义 

    const int MOUSEEVENTF_MOVE = 0x0001;      移动鼠标 
    const int MOUSEEVENTF_LEFTDOWN = 0x0002; 模拟鼠标左键按下 
    const int MOUSEEVENTF_LEFTUP = 0x0004; 模拟鼠标左键抬起 
    const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 模拟鼠标右键按下 
    const int MOUSEEVENTF_RIGHTUP = 0x0010; 模拟鼠标右键抬起 
    const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 模拟鼠标中键按下 
    const int MOUSEEVENTF_MIDDLEUP = 0x0040; 模拟鼠标中键抬起 
    const int MOUSEEVENTF_ABSOLUTE = 0x8000; 标示是否采用绝对坐标 


    程序中我们直接调用mouse_event函数就可以了 
    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0); 

    1、这里是鼠标左键按下和松开两个事件的组合即一次单击: 
    mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

    2、模拟鼠标右键单击事件: 
    mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 ) 

    3、两次连续的鼠标左键单击事件 构成一次鼠标双击事件: 
    mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 
    mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

    4、使用绝对坐标 
    MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0 

    需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点。5、直接设定绝对坐标并单击 
    mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 
    mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 
    其中X,Y分别是你要点击的点的横坐标和纵坐标 

    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    iOS NSDictionary或NSArray与JSON字符串相互转换
    iOS 如何用Xib画一个Button
    iOS 你不知道的字符串用法
    IOS ScrollView pagingEnabled移动指定偏移
    TableView行缩进 自定义cell时候
    支付宝回调
    微信支付回调
    关于Bundle传递消息
    关于Handler
    ExpandableListView
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13615559.html
Copyright © 2020-2023  润新知