Здравствуйте! Как получать координаты мыши за приделами окна? Желательно без админских прав. Использую GetCursorPos возвращает LastError=3E6h ERROR_NOACCESS Как установить WINSTA_READATTRIBUTES?
Про абсолютные координаты и без привязки к окну есть https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmousemovepointsex
Код (Text): format pe console 4.0 include 'win32ax.inc' entry main struct CURSORINFO cbSize dd ? flags dd ? hCursor dd ? ptScreenPos POINT ends section '.code' code data readable executable proc main locals binCursorInfo CURSORINFO szMessage rb 1024 endl @@: invoke memset,addr binCursorInfo,0,sizeof.CURSORINFO add esp,3*4 mov [binCursorInfo.cbSize],sizeof.CURSORINFO invoke GetCursor mov [binCursorInfo.hCursor],eax invoke GetCursorInfo,addr binCursorInfo invoke wsprintfA,addr szMessage,.pattern,[binCursorInfo.ptScreenPos.x],[binCursorInfo.ptScreenPos.y] add esp,4*4 stdcall write_console,addr szMessage invoke Sleep,100 jmp @B ret .pattern db '%d,%d',13,10,0 endp proc write_console szMessage locals hStdOutput dd ? nBytesWritten dd ? endl invoke GetStdHandle,STD_OUTPUT_HANDLE mov [hStdOutput],eax invoke lstrlenA,[szMessage] invoke WriteFile,[hStdOutput],[szMessage],eax,addr nBytesWritten,0 ret endp section '.data' data readable writable data import library ntdll,'ntdll.dll',user32,'user32.dll',kernel32,'kernel32.dll' import ntdll,\ memset,'memset' include 'api\user32.inc' include 'api\kernel32.inc' end data
Огромное спасибо, f13nd! Работает, проблема в выравнивании структуры Код (ASM): CURSORINFO struct cbSize dd ? flags dd ? hCursor dq ? ptScreenPos POINT <> CURSORINFO ends SAVE macro REG for R,<REG> push R endm endm .code WinMain proc local msg:MSG xor ebx,ebx mov esi,offset WndProc invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName SAVE <rax,rdi,rbx,COLOR_WINDOW,rax,rax,IMAGE_BASE,rbx,rsi,\ (sizeof WNDCLASSEX)> invoke RegisterClassExA,esp ;addr WNDCLASSEX SAVE <rbx,IMAGE_BASE,rbx,rbx,400,600,CW_USEDEFAULT,CW_USEDEFAULT> sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,0,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local hdc:HDC local buffer[20]:BYTE mov hWnd,rcx for msg,<DESTROY, CREATE, TIMER> cmp edx,WM_&msg je wm&msg endm leave jmp NtdllDefWindowProc_ wmDESTROY:invoke KillTimer,hWnd,1 invoke RtlExitUserProcess,NULL wmCREATE:invoke SetTimer,hWnd,1,100,0 jmp wmBYE wmTIMER:xor eax,eax mov ecx,(sizeof CURSORINFO)/4 mov edi,offset binCursorInfo rep stosd invoke GetDC,hWnd mov hdc,rax invoke GetCursor mov binCursorInfo.hCursor,rax mov binCursorInfo.cbSize,sizeof CURSORINFO mov binCursorInfo.flags,CURSOR_SHOWING invoke GetCursorInfo,&binCursorInfo mov r9d,binCursorInfo.ptScreenPos.y mov r8d,binCursorInfo.ptScreenPos.x invoke wsprintfA,&buffer,&fmt invoke TextOut,hdc,0,0,&buffer,eax invoke ReleaseDC,hWnd,hdc wmBYE: leave retn WndProc endp .data ClassName db 'Координаты курсора за пределами окна',0 fmt db 'X=%04d Y=%04d',0 FileName db "br_Rabbit3.cur",0 align 4; <--- binCursorInfo CURSORINFO <> end
Как вариант Код (ASM): SAVE macro REG for R,<REG> push R endm endm .code WinMain proc local msg:MSG xor ebx,ebx mov esi,offset WndProc invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName SAVE <rax,rdi,rbx,COLOR_WINDOW,rax,rax,IMAGE_BASE,rbx,\ rsi,(sizeof WNDCLASSEX)> invoke RegisterClassExA,esp ;addr WNDCLASSEX SAVE <rbx,IMAGE_BASE,rbx,rbx,400,600,CW_USEDEFAULT,CW_USEDEFAULT> sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,0,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local hdc:HDC local buffer[20]:BYTE mov hWnd,rcx for msg,<DESTROY, CREATE, TIMER> cmp edx,WM_&msg je wm&msg endm leave jmp NtdllDefWindowProc_ wmDESTROY:invoke KillTimer,hWnd,1 invoke RtlExitUserProcess,NULL wmCREATE:invoke SetTimer,hWnd,1,100,0 jmp wmBYE wmTIMER:invoke GetDC,hWnd mov hdc,rax invoke GetCursorPos,&mouse mov r9d,mouse.y mov r8d,mouse.x invoke wsprintfA,&buffer,&fmt invoke TextOut,hdc,0,0,&buffer,eax invoke ReleaseDC,hWnd,hdc wmBYE: leave retn WndProc endp .data ClassName db 'Координаты курсора за пределами окна',0 fmt db 'X=%04d Y=%04d',0 FileName db "br_Rabbit3.cur",0 align 4 mouse POINT <> end
Можно вроде из интерналс вытащить в обход GetCursorPos/GetCursorInfo(отсюда берут коорд, но со стороны кернел): SHAREDINFO.SERVERINFO.PERUSERSERVERINFO.ptCursor, отображено на юзер должно быть. Это если в обход noaccess