Limitar o ponteiro a uma diagonal

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

Moderator: Gio

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

Limitar o ponteiro a uma diagonal

22 Sep 2020, 23:33

Como faço para limitar o ponteiro somente a uma diagonal de coordenadas escolhidas quando apertada uma tecla "x" e liberar o campo de ação quando apertada uma "y"?

Obrigado pela atenção! :)
User avatar
Gio
Posts: 1068
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Limitar o ponteiro a uma diagonal

23 Sep 2020, 17:02

Boa tarde LuanMTS.

É uma pergunta bem semelhantes à que você fez neste tópico.

A resposta também é praticamente a mesma:

Primeiro, implemente um hook no mouse que permita que uma função seja chamada quando o mouse se mover.
depois, esta função deve usar uma fórmula para calcular se a posição atual do mouse está dentro ou fora da diagonal prentendida. Se estiver dentro, nada será feito, mas se estiver fora, a função deverá calcular qual a posição da diagonal que estaria mais próximo da nova posição do mouse e movê-lo automaticamente para lá.

:arrow: No caso da diagonal criar pelos valores dos eixos X e Y serem iguais, o código é bem simples:

Code: Select all

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

y::
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 > NOVO_Y) OR (NOVO_X < NOVO_Y)
		{		
			DllCall("SetCursorPos", "Int", NOVO_X, "Int", NOVO_X)
			Return 1
		}
		else 
		{
			Return DllCall("CallNextHookEx", "Uint", 0, "int", nCode, "Uint", wParam, "Uint", lParam) 
		}
	}
}
return
:arrow: Caso a diagonal precise se movida para esquerda ou direita, cima ou baixo, basta adicionar os números necessários nos cálculos comparativos e também nas novas posições. Caso a diagonal seja invertida (descendo da direita para a esquerda), você poderá usar a diferença entre a resolução da tela em cada eixo e a posição XY para criar a diagonal desejada.

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 2 guests