利用键盘事件keybd_event(Win32 API)模拟键盘按键
来源:互联网 发布:vr算法 编辑:程序博客网 时间:2024/05/22 15:44
云平台第三次重置后,通过FTP传输文件的途径失效,因此需要其他方法向自己的云桌面发送代码。无论云桌面怎么设置,都必须支持接收键盘和鼠标的输入,因此如果可以模拟键盘输入,就可以实现发送代码的功能。
Win32API中提供了 keybd_event 函数
Syntax
_In_ BYTE bVk,
_In_ BYTE bScan,
_In_ DWORD dwFlags,
_In_ ULONG_PTR dwExtraInfo
);
Demonstration:
#include <windows.h>#include <stdio.h>void SendKey(const char ch) { DWORD sc, shift; unsigned char vkey; sc = OemKeyScan(ch); shift = sc >> 16; vkey = MapVirtualKey(sc & 0xffff, 1); if (shift) keybd_event(VK_SHIFT, 0, 0, 0); keybd_event(vkey, 0, 0, 0); keybd_event(vkey, 0, KEYEVENTF_KEYUP, 0); if (shift) keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);}void SendKeyString(const char *str) { DWORD sc, shift; unsigned char vkey; int i; for (i = 0; str[i] != '\0'; i++) { sc = OemKeyScan(str[i]); shift = sc >> 16; vkey = MapVirtualKey(sc & 0xffff, 1); if (shift) keybd_event(VK_SHIFT, 0, 0, 0); keybd_event(vkey, 0, 0, 0); keybd_event(vkey, 0, KEYEVENTF_KEYUP, 0); if (shift) keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); }}int main() { // hello world text to send // load text from a file in practise const char *text = "#include <stdio.h>\n" "int main() {\n" "\tprintf(\"Hello world!\\n\");\n" "\treturn 0;\n" "}\n"; // count down for 3 sec // after 3 sec, this program will simulate keyboard events // prepared to choose the target window to send text putchar('\a'); Sleep(1000); putchar('\a'); Sleep(1000); putchar('\a'); Sleep(1000); SendKeyString(text); return 0;}
微软表示这个函数已经被废弃了,推荐用SendInput 来代替它。本人亲测以上代码在记事本窗口中成功输入,但是切换到云桌面窗口无效,估计是因为云桌面为了键盘响应的效率,直接使用了底层的键盘驱动程序。我尝试修改过传入bScan(扫描码)但不奏效,估计改用SendInput也不会成功。
为了更好地支持底层键盘输入,可以考虑WinIO库或者使用按键精灵软件。
Parameters
- bVk [in]
Type: BYTE
A virtual-key code. The code must be a value in the range 1 to 254. For a complete list, see Virtual Key Codes.
- bScan [in]
Type: BYTE
A hardware scan code for the key.
- dwFlags [in]
Type: DWORD
Controls various aspects of function operation. This parameter can be one or more of the following values.
Value Meaning - KEYEVENTF_EXTENDEDKEY
- 0x0001
If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
- KEYEVENTF_KEYUP
- 0x0002
If specified, the key is being released. If not specified, the key is being depressed.
- dwExtraInfo [in]
Type: ULONG_PTR
An additional value associated with the key stroke.
参数 类型及说明
bVk Byte 定义一个虚据拟键码。键码值必须在1~254之间。
bScan Byte 键的OEM扫描码 (一般置零)
dwFlags Long 零;或设为下述两个标志之一
KEYEVENTF_EXTENDEDKEY 指出是一个扩展键,而且在前面冠以0xE0代码
KEYEVENTF_KEYUP 模拟松开一个键
dwExtraInfo Long 通常不用的一个值。api函数GetMessageExtraInfo可取得这个值。允许使用的值取决于特定的驱动程序
备注:尽管keybd_event传递一个与OEM相关的硬件扫描码给系统,但应用程序不能用 此扫描码。系统在内部将扫描码转换成虚拟键码,并且在传送给应用程序前清除键码的UP/down位。应用程序可以摸拟PRINTSCREEN键的按下来获 得一个屏幕快照,并把它存放到剪切板中。若要做到这一点,则要将keybd_event的bVk参数置为VK_SNAPSHOT,bScan参数置为 0(用以获得全屏快照)或hScan置为1(仅获得活动窗口的快照)。Windows CE:WindowsCE支持dwFlags参数附加的标志位。即使用KEYEVENTF_SILENT标志模拟击键,而不产生敲击的声音。 Windows CE不支持KEYEVENTF_EXTENDEDKEY标志。
- 利用键盘事件keybd_event(Win32 API)模拟键盘按键
- C# 调用API keybd_event 模拟键盘事件
- C#中keybd_event实例(键盘钩子模拟按键)
- C# 使用keybd_event()函数模拟键盘按键
- 模拟键盘API函数Keybd_event用法
- 模拟键盘API函数Keybd_event用法
- 模拟键盘事件PostMessage和keybd_event
- android 模拟键盘按键事件
- Unity 模拟键盘按键事件
- keybd_event,mouse_event 模拟产生键盘事件、鼠标事件的使用
- 模拟键盘、鼠标 mouse_event keybd_event
- 模拟键盘、鼠标输入keybd_event
- mouse_event(模拟鼠标)和keybd_event(模拟键盘)
- VC+API模拟键盘按键(详解篇)
- C语言实现模拟键盘按键事件
- Unigine 监听键盘事件和模拟按键
- Qt获取键盘按键事件(Windows API)----StateReader系列
- Cocos2d-x Win32键盘模拟触摸事件
- Android初识BLE4.0
- iOS开发学习路线和规划
- Android 监听器
- Android Studio编译输出apk文件修改文件名
- 支持下拉刷新和滑动删除的ListView----PullToRefresh, EnhancedListView项目整合
- 利用键盘事件keybd_event(Win32 API)模拟键盘按键
- 打开手机自带的应用市场
- 页面刷新的reload()和refresh()方法有什么不同
- SearchView和Listview的绑定,模糊查询
- oracle 时间类型(日期) 转 成英文格式(时间)
- 不能嵌套解析xml
- [noip2002pj] 过河卒
- ORACLE日常操作手册
- 基于事件的JavaScript编程:异步与同步