使用NASM汇编器模拟Windows键盘按键:CapsLock无法释放求助
问题分析与解决
你的代码问题出在**keybd_event函数的参数传递错误**:Win32 API的keybd_event是stdcall调用约定,需要按从右到左的顺序传入4个完整参数,而你的代码只传了2个参数,且顺序颠倒,导致按键释放的逻辑没有正确执行。
keybd_event的核心参数说明(stdcall调用):
bVk:虚拟键码,CapsLock对应0x14(VK_CAPITAL)bScan:按键扫描码,CapsLock为0x3A,也可传0让系统自动映射dwFlags:事件标志,0表示按键按下(KEYEVENTF_KEYDOWN),0x2表示按键释放(KEYEVENTF_KEYUP)dwExtraInfo:额外信息,传0即可
修正后的代码
section .text global _start extern ExitProcess extern keybd_event _start: ; 模拟CapsLock按键按下 push 0 ; dwExtraInfo = 0 push 0 ; dwFlags = KEYEVENTF_KEYDOWN push 0x3A ; bScan = CapsLock扫描码 push 0x14 ; bVk = VK_CAPITAL call keybd_event ; 模拟CapsLock按键释放 push 0 ; dwExtraInfo = 0 push 0x2 ; dwFlags = KEYEVENTF_KEYUP push 0x3A ; bScan = CapsLock扫描码 push 0x14 ; bVk = VK_CAPITAL call keybd_event call ExitProcess
编译命令保持不变
nasm -f win32 mouse.asm -o mouse.obj golink /entry:_start /console kernel32.dll user32.dll mouse.obj
修正后运行程序,CapsLock会正确完成按下+释放的完整模拟,无需手动按键恢复。
内容的提问来源于stack exchange,提问作者Nihat Umarov
相关产品推荐
相关产品推荐

