我正在尝试利用汇编语言中的 GetAsyncKeyState 函数来检测键盘按键的状态。具体来说,我想在用户按下“W”键时打印一条消息。但是,我在尝试使用 GetAsyncKeyState 函数时遇到了“未定义符号”错误。
我已确保已正确包含 user32.lib 库文件,并且在代码中使用了正确的函数名称。我什至尝试手动添加 extern GetAsyncKeyState: PROC 来声明 GetAsyncKeyState 函数,但问题仍然存在。
INCLUDE Irvine32.inc
INCLUDELIB user32.lib
.data
message db "user32.lib is working!", 0
msg db "You pressed 'W'", 0
.code
main proc
invoke MessageBoxA, 0, ADDR message, ADDR caption, MB_OK
call CheckForKey
main endp
CheckForKey PROC
mov eax, 'W'
call GetAsyncKeyState
test eax, eax
jz notPressed
mov edx, OFFSET msg
call WriteString
jmp endCheck
notPressed:
jmp endCheck
endCheck:
ret
CheckForKey ENDP
end main
我想测试使用 GetAsyncKeyState 按“W”时是否可以打印字符串,但在使用 GetAsyncKeyState 时遇到此错误。我想知道可能导致此错误的原因以及如何解决它。任何帮助将不胜感激!
根据您和@MichaelPetch的评论,添加行
GetAsyncKeyState PROTO STDCALL :DWORD
解决了“未定义的符号”问题。您还可以参阅如何在 x64 MASM 程序中调用 Windows API 以获取更多信息。
第二期,
但是,当我按下键盘上的W键时,程序 自动终止而不显示消息“您按下了 ‘W’”。
也正如@MichaelPetch所说,您需要将
AsyncGetKeyState
放入循环中。您的进程不会等待您的输入并终止。请参阅 此 GetAsyncKeyState 示例。