Assembly MASM32中的鼠标选择

Assembly MASM32中的鼠标选择,assembly,mouseclick-event,masm32,irvine32,Assembly,Mouseclick Event,Masm32,Irvine32,最后,我尝试在鼠标左键单击时使用汇编语言选择一个按钮,但没有找到任何有用的技术。任何帮助都将不胜感激!该程序的代码如下所示 INCLUDE IRVINE32.inc INCLUDELIB kernel32.lib INCLUDELIB user32.lib INCLUDELIB Winmm.lib INCLUDELIB Windows.lib INCLUDELIB kernel32.lib INCLUDELIB gdi32.lib WinMain proto :DWORD,:DWORD,:

最后,我尝试在鼠标左键单击时使用汇编语言选择一个按钮,但没有找到任何有用的技术。任何帮助都将不胜感激!该程序的代码如下所示

INCLUDE IRVINE32.inc
INCLUDELIB kernel32.lib
INCLUDELIB user32.lib
INCLUDELIB Winmm.lib
INCLUDELIB Windows.lib
INCLUDELIB kernel32.lib
INCLUDELIB gdi32.lib



WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO STDCALL :DWORD

WM_LBUTTONDOWN EQU 0x0201

.data
prompt BYTE "Mouse Not Pressed",0
message BYTE "Mouse pressed",0
MouseClick db 0
WM_LBUTTONDOWN bytE 0x0201



.code
main PROC 
mov edx, OFFSET message
.IF WM_LBUTTONDOWN == true
Call WriteString
.ENDIF
mov edx, OFFSET prompt
Call WriteString

invoke ExitProcess, 0
main ENDP
END main
感谢您,我可以为您的需求树立一个榜样:

include irvine32.inc

.data

    hStdIn    dd 0
    nRead     dd 0

    _INPUT_RECORD STRUCT
        EventType   WORD ?
        WORD ?                    ; For alignment
        UNION
            KeyEvent              KEY_EVENT_RECORD          <>
            MouseEvent            MOUSE_EVENT_RECORD        <>
            WindowBufferSizeEvent WINDOW_BUFFER_SIZE_RECORD <>
            MenuEvent             MENU_EVENT_RECORD         <>
            FocusEvent            FOCUS_EVENT_RECORD        <>
          ENDS
    _INPUT_RECORD ENDS

    InputRecord _INPUT_RECORD <>

    ConsoleMode dd 0
    Msg db "Click! ",0
    Msg2 db "Esc ",0

.code

main PROC
    invoke GetStdHandle,STD_INPUT_HANDLE
    mov   hStdIn,eax

    invoke GetConsoleMode, hStdIn, ADDR ConsoleMode
    mov eax, 0090h          ; ENABLE_MOUSE_INPUT | DISABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS
    invoke SetConsoleMode, hStdIn, eax

    .WHILE InputRecord.KeyEvent.wVirtualKeyCode != VK_ESCAPE

        invoke ReadConsoleInput,hStdIn,ADDR InputRecord,1,ADDR nRead

        movzx  eax,InputRecord.EventType
        cmp eax, MOUSE_EVENT
        jne no_mouse
        test InputRecord.MouseEvent.dwButtonState, 1
        jz no_mouse

        lea edx, Msg
        Call WriteString
        jmp done

        no_mouse:
    .ENDW

    lea edx, Msg2
    Call WriteString

    done:
    mov eax, ConsoleMode
    invoke SetConsoleMode, hStdIn, eax
    call ReadChar
    invoke ExitProcess, 0
main ENDP

end main
包括irvine32.inc
.数据
hStdIn dd 0
nRead dd 0
_输入记录结构
事件类型词?
单词用于校准
联合
按键事件按键事件记录
鼠标事件鼠标事件记录
WindowBufferSizeEvent窗口\缓冲区\大小\记录
菜单事件菜单事件记录
焦点事件焦点事件记录
末端
_输入记录结束
输入记录
控制台模块dd 0
Msg db“单击!”,0
Msg2数据库“Esc”,0
.代码
主进程
调用GetStdHandle、STD\u输入\u句柄
mov-hStdIn,eax
调用GetConsoleMode、hStdIn、ADDR ConsoleMode
mov-eax,0090h;启用|鼠标|输入|禁用|快速|编辑|模式|启用|扩展|标志
调用SetConsoleMode、hStdIn、eax
.WHILE InputRecord.KeyEvent.wVirtualKeyCode!=越狱
调用ReadConsoleInput、hStdIn、ADDR InputRecord、1、ADDR nRead
movzx eax,InputRecord.EventType
cmp eax,鼠标事件
jne无鼠
测试输入putrecord.MouseEvent.dwButtonState,1
jz无_鼠标
lea edx,味精
通话记录
jmp完成
无鼠标:
ENDW先生
lea edx,Msg2
通话记录
完成:
mov eax,控制台模式
调用SetConsoleMode、hStdIn、eax
调用ReadChar
调用ExitProcess,0
主端
端干管

删除了我的最后一条评论,我认为对齐问题很久以前就已经解决了。@MichaelPetch:你是说?它似乎在masm32v11r/windows.inc以及irvine32.inc/smallwin.inc中都已修复。但当地的声明让这个例子更加明确:——)足够公平。我删除了我的评论,因为我意识到这比道歉更安全,因为没有提到修改。“我是你的选民。”迈克尔佩奇谢谢你的例子。这大大打开了我的理解。@user5577817:我不是帮助你的那个善良的灵魂-rkhb是。如果这个答案对你有帮助,请考虑接受这个答案。有关如何接受以及为什么接受的更多信息,请参见以下SO信息: