标签:资源管理器 双击 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分别是你要点击的点的横坐标和纵坐标
标签:资源管理器 双击 str uml ons 快速 需要 方便 窗口
原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13615559.html