Как получать координаты мыши за пределами окна

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 19 окт 2025.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    Здравствуйте! Как получать координаты мыши за приделами окна? Желательно без админских прав. Использую GetCursorPos возвращает LastError=3E6h ERROR_NOACCESS
    Как установить WINSTA_READATTRIBUTES?
     
    Последнее редактирование: 19 окт 2025
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.073
    Mikl___ нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    f13nd,
    может быть есть ссылка на работающий пример?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.073
    Код (Text):
    1. format pe console 4.0
    2. include 'win32ax.inc'
    3. entry main
    4.  
    5. struct CURSORINFO
    6.     cbSize        dd ?
    7.     flags        dd ?
    8.     hCursor        dd ?
    9.     ptScreenPos    POINT
    10. ends
    11.  
    12. section '.code' code data readable executable
    13.  
    14. proc main
    15.             locals
    16.                 binCursorInfo    CURSORINFO
    17.                 szMessage        rb 1024
    18.             endl
    19.             @@:
    20.             invoke memset,addr binCursorInfo,0,sizeof.CURSORINFO
    21.             add esp,3*4
    22.             mov [binCursorInfo.cbSize],sizeof.CURSORINFO
    23.             invoke GetCursor
    24.             mov [binCursorInfo.hCursor],eax
    25.             invoke GetCursorInfo,addr binCursorInfo
    26.             invoke wsprintfA,addr szMessage,.pattern,[binCursorInfo.ptScreenPos.x],[binCursorInfo.ptScreenPos.y]
    27.             add esp,4*4
    28.             stdcall write_console,addr szMessage
    29.             invoke Sleep,100
    30.             jmp @B
    31.             ret
    32.             .pattern    db '%d,%d',13,10,0
    33. endp
    34.  
    35. proc write_console szMessage
    36.             locals
    37.                 hStdOutput        dd ?
    38.                 nBytesWritten   dd ?
    39.             endl
    40.             invoke GetStdHandle,STD_OUTPUT_HANDLE
    41.             mov [hStdOutput],eax
    42.             invoke lstrlenA,[szMessage]
    43.             invoke WriteFile,[hStdOutput],[szMessage],eax,addr nBytesWritten,0
    44.             ret
    45. endp
    46.  
    47. section '.data' data readable writable
    48. data import
    49.     library ntdll,'ntdll.dll',user32,'user32.dll',kernel32,'kernel32.dll'
    50.     import ntdll,\
    51.         memset,'memset'
    52.     include 'api\user32.inc'
    53.     include 'api\kernel32.inc'
    54. end data
     
    Mikl___ нравится это.
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    Огромное спасибо, f13nd! Работает, проблема в выравнивании структуры
    Код (ASM):
    1. CURSORINFO struct
    2.        cbSize dd ?
    3.        flags dd ?
    4.        hCursor dq ?
    5.        ptScreenPos POINT <>
    6. CURSORINFO ends
    7. SAVE macro REG
    8. for R,<REG>
    9. push R
    10. endm
    11. endm
    12. .code
    13. WinMain proc
    14. local msg:MSG
    15.        xor ebx,ebx
    16.        mov esi,offset WndProc
    17.        invoke LoadCursorFromFileA,&FileName
    18.        mov edi,offset ClassName
    19.        SAVE <rax,rdi,rbx,COLOR_WINDOW,rax,rax,IMAGE_BASE,rbx,rsi,\
    20.        (sizeof WNDCLASSEX)>      
    21.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    22.        SAVE <rbx,IMAGE_BASE,rbx,rbx,400,600,CW_USEDEFAULT,CW_USEDEFAULT>
    23.        sub esp,20h
    24.        invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    25.        lea edi,msg
    26. @@: invoke GetMessageA,edi,0,0,0
    27.        invoke DispatchMessageA,edi
    28.        jmp @b
    29. WinMain endp
    30. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    31. local   hdc:HDC
    32. local buffer[20]:BYTE
    33.        mov hWnd,rcx
    34. for msg,<DESTROY, CREATE, TIMER>
    35.        cmp edx,WM_&msg
    36.        je wm&msg
    37. endm
    38.        leave
    39.        jmp NtdllDefWindowProc_
    40. wmDESTROY:invoke KillTimer,hWnd,1
    41.        invoke RtlExitUserProcess,NULL
    42. wmCREATE:invoke SetTimer,hWnd,1,100,0
    43.        jmp wmBYE
    44. wmTIMER:xor eax,eax
    45.        mov ecx,(sizeof CURSORINFO)/4
    46.        mov edi,offset binCursorInfo
    47.        rep stosd
    48.        invoke GetDC,hWnd
    49.        mov hdc,rax
    50.        invoke GetCursor
    51.        mov binCursorInfo.hCursor,rax
    52.        mov binCursorInfo.cbSize,sizeof CURSORINFO
    53.        mov binCursorInfo.flags,CURSOR_SHOWING
    54.        invoke GetCursorInfo,&binCursorInfo
    55.        mov r9d,binCursorInfo.ptScreenPos.y
    56.        mov r8d,binCursorInfo.ptScreenPos.x
    57.        invoke wsprintfA,&buffer,&fmt
    58.        invoke TextOut,hdc,0,0,&buffer,eax
    59.        invoke ReleaseDC,hWnd,hdc
    60. wmBYE: leave
    61.        retn
    62. WndProc endp
    63. .data
    64. ClassName db 'Координаты курсора за пределами окна',0
    65. fmt db 'X=%04d Y=%04d',0
    66. FileName db "br_Rabbit3.cur",0
    67. align 4; <---
    68. binCursorInfo    CURSORINFO <>
    69. end
     
    Последнее редактирование: 3 ноя 2025
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    Как вариант
    Код (ASM):
    1. SAVE macro REG
    2.      for R,<REG>
    3.      push R
    4.      endm
    5. endm
    6. .code
    7. WinMain proc
    8. local msg:MSG
    9.        xor ebx,ebx
    10.        mov esi,offset WndProc
    11.        invoke LoadCursorFromFileA,&FileName
    12.        mov edi,offset ClassName
    13.        SAVE <rax,rdi,rbx,COLOR_WINDOW,rax,rax,IMAGE_BASE,rbx,\
    14.        rsi,(sizeof WNDCLASSEX)>    
    15.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    16.        SAVE <rbx,IMAGE_BASE,rbx,rbx,400,600,CW_USEDEFAULT,CW_USEDEFAULT>
    17.        sub esp,20h
    18.        invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    19.        lea edi,msg
    20. @@: invoke GetMessageA,edi,0,0,0
    21.        invoke DispatchMessageA,edi
    22.        jmp @b
    23. WinMain endp
    24. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    25. local   hdc:HDC
    26. local buffer[20]:BYTE
    27.        mov hWnd,rcx
    28. for msg,<DESTROY, CREATE, TIMER>
    29.        cmp edx,WM_&msg
    30.        je wm&msg
    31. endm
    32.        leave
    33.        jmp NtdllDefWindowProc_
    34. wmDESTROY:invoke KillTimer,hWnd,1
    35.        invoke RtlExitUserProcess,NULL
    36. wmCREATE:invoke SetTimer,hWnd,1,100,0
    37.        jmp wmBYE
    38. wmTIMER:invoke GetDC,hWnd
    39.        mov hdc,rax
    40.        invoke GetCursorPos,&mouse
    41.        mov r9d,mouse.y
    42.        mov r8d,mouse.x
    43.        invoke wsprintfA,&buffer,&fmt
    44.        invoke TextOut,hdc,0,0,&buffer,eax
    45.        invoke ReleaseDC,hWnd,hdc
    46. wmBYE: leave
    47.        retn
    48. WndProc endp
    49. .data
    50. ClassName db 'Координаты курсора за пределами окна',0
    51. fmt       db 'X=%04d Y=%04d',0
    52. FileName  db "br_Rabbit3.cur",0
    53. align 4
    54. mouse          POINT <>
    55. end
     
    Последнее редактирование: 3 ноя 2025
    miilalex и Research нравится это.
  7. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    372
    Можно вроде из интерналс вытащить в обход GetCursorPos/GetCursorInfo(отсюда берут коорд, но со стороны кернел): SHAREDINFO.SERVERINFO.PERUSERSERVERINFO.ptCursor, отображено на юзер должно быть. Это если в обход noaccess :swoon:
     
    Mikl___ нравится это.