网络编程keybd_event 达到远控目的

技术文章 1年前 (2020) 完美者
594 0

标签:资源管理器   双击   str   uml   ons   快速   需要   方便   窗口   

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分别是你要点击的点的横坐标和纵坐标 

网络编程keybd_event 达到远控目的

标签:资源管理器   双击   str   uml   ons   快速   需要   方便   窗口   

原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13615559.html

版权声明:完美者 发表于 2020-09-17 13:23:40。
转载请注明:网络编程keybd_event 达到远控目的 | 完美导航

暂无评论

暂无评论...