Barreiras na tela

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

LuanMts
Posts: 20
Joined: 24 May 2020, 00:36

Barreiras na tela

22 Sep 2020, 23:58

Como faço para criar retângulos, triângulos, retas aonde o ponteiro não pode transitar?
Agradeço a atenção!
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Barreiras na tela

23 Sep 2020, 16:51

Boa tarde LuanMTS.


Você tem feito várias perguntas semelhantes a esta. Está tentando criar um labirinto para o mouse ou coisa do tipo? :P

Não conheço nenhuma uma função específica para criar uma área inacessível ao mouse em "qualquer forma que você possa imaginar", mas sei que você pode criar um hook no mouse e movê-lo imediatamente sempre que o mesmo adentrar a "área proibida". O efeito é praticamente o mesmo.

Exemplo: No código abaixo, ao pressionar F2, o script cria uma área entre as coordenadas XY 500,200 e XY 900,600 onde o mouse será expulso sempre que adentrar. Com o F3 você pode então desativar a área restrita e com o F4 fechar o script.

Code: Select all

F2::
SetBatchLines, -1
hHookMouse := DllCall("SetWindowsHookEx", "int", 14, "Uint", RegisterCallback("Prender_Mouse_Fora_Da_Area", "Fast"), "Uint", 0, "Uint", 0)
Return

F3::
DllCall("UnhookWindowsHookEx", "Uint", hHookMouse)
return

F4::
ExitApp
Return

Prender_Mouse_Fora_Da_Area(nCode, wParam, lParam)
{
	Critical
	if !nCode && (wParam = 0x200)  ; 0x200 = mensagem WM_MOUSEMOVE 
	{
		NOVO_X := NumGet(lParam+0, 0, "Int")
		NOVO_Y := NumGet(lParam+0, 4, "Int")
		
		If (((NOVO_X >= 500) AND (NOVO_X <= 900)) AND ((NOVO_Y >= 200) AND (NOVO_Y <= 600)))
		{
			If ((NOVO_X >= 500) AND (NOVO_X < 520))
			{
				DllCall("SetCursorPos", "Int", 499, "Int", NOVO_Y)
			}
			Else if ((NOVO_X > 880) AND NOVO_X <= 900)
			{
				DllCall("SetCursorPos", "Int", 901, "Int", NOVO_Y)
			}
			
			Else If ((NOVO_Y >= 200) AND (NOVO_Y < 220))
			{
				DllCall("SetCursorPos", "Int", NOVO_X, "Int", 199)
			}
			Else if ((NOVO_Y > 580) AND (NOVO_Y <= 600))
			{
				DllCall("SetCursorPos", "Int", NOVO_X, "Int", 601)
			}
			Return 1
		}
		else 
		{
			Return DllCall("CallNextHookEx", "Uint", 0, "int", nCode, "Uint", wParam, "Uint", lParam) 
		}
	}
} 
return

:arrow: Apesar de a área do exemplo acima ser retangular, você pode utilizar a matemática para tornar a área restrita em qualquer outra forma que você quiser (só tem que descobrir a fórmula certa para testar se o mouse está ou não está na área). Você pode encontrar um exemplo de área proibida em formato de circulo que o usuário Nextron criou neste post. Quanto às retas, elas são retângulos de 1 linha só, e quanto aos triângulos, eu deixo para você mesmo desvendar a fórmula matemática para saber se o ponto do mouse está lá dentro e então agir expulsando-o.

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 28 guests