Crosshair en centro de ventana activa Topic is solved

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

Thorx
Posts: 98
Joined: 23 Nov 2015, 18:53

Crosshair en centro de ventana activa

07 Jul 2017, 20:49

Holas nesesito un crosshair en medio de la ventana activa , he hallado este aqui pero no se ejecuta en el centro y tengo que deslizar la ventana activa y centrarlo . Otra cosa que en la barra de tareas aparece el boton de Autohotkey cosa que no aparecia antes . Si puede evitarse esto y que aparezca al centro de la ventana activa seria perfecto .

Code: Select all

gui, +AlwaysOnTop
Gui, Color, FF0000
WinSet, TransColor,FF0000
gui, -Caption 
gui, show, w5 h5, 
WinGetPos, X, Y, W, H,
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
Location: France
Contact:

Re: Crosshair en centro de ventana activa

07 Jul 2017, 21:39

Hola,

Quedandose lo mas sencillo possible:

Code: Select all

#NoEnv
#Warn
#SingleInstance force


GUI, 1:+hwndID +Resize +Owner ; rescata y salva en ID el ID de la ventana de la GUI
AHKID := "ahk_id " . ID
GUI, 1:Show, w400 h400
GUI, 2:-Caption +AlwaysOnTop +Owner ; +Owner evita que en la barra de tareas aparezca el boton de Autohotkey
GUI, 2:Color, Red, Red
GUI, 2:Show, w5 h5, 
SetTimer, subrutina, 100 ; cada 100ms ejecuta la subrutina mas abajo
return

GuiClose:
ExitApp

subrutina:
WinGetPos, x, y, w, h, % AHKID ; rescata la posicion de la ventana principal
GUI, 2:Show, % "NA x" . (x+w//2)-5 . " y" . (y+h//2)-5 ; NA hace que el retículo no robe el enfoque a la ventana principal
return
Saludos


[EDIT]
Alternativamente, y especialmente si el movimiento del retículo no te parece bastante suave, puedes utilizar el método del codigo abajo:

Code: Select all

GUI, 1:+hwndID +Resize
global AHKID := "ahk_id " . ID ; rescata y salva en ID el ID de la ventana de la GUI
GUI, 1:Show, w400 h400
WinGet, PID, PID, % AHKID ; rescata y salva en PID el ID del proceso de la GUI
GUI, 2:-Caption +AlwaysOnTop +Owner ; +Owner evita que en la barra de tareas aparezca el boton de Autohotkey
GUI, 2:Color, Red, Red
GUI, 2:Show, w5 h5, 
EVENT_OBJECT_LOCATIONCHANGE := 0x800B ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd318066(v=vs.85).aspx
hWinEventHook := SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE
				, EVENT_OBJECT_LOCATIONCHANGE
				, 0
				, RegisterCallback("OnLocationChange")
				, PID
				, 0
				, 0) ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx ~ registra OnLocationChange como función de rellamada para el acontecimiento OBJECT_LOCATIONCHANGE
OnExit, exitSub
return
GuiClose:
exitSub:
UnhookWinEvent(hWinEventHook)
ExitApp

; ------------------------------------------------------------------------------------

onLocationChange(__hWinEventHook, __event, __hwnd) {

	if not (__hwnd) ; porque el sistema envia el acontecimiento tambien por el cursor si fuera necesario
return

SetWinDelay, -1

	WinGetPos, __x, __y, __w, __h, % AHKID
	GUI, 2:Show, % "NA x" . (__x+__w//2)-5 . " y" . (__y+__h//2)-5

}

; =====================================================

SetWinEventHook(__eventMin, __eventMax, __hmodWinEventProc, __lpfnWinEventProc, __idProcess, __idThread, __dwFlags) {
   DllCall("CoInitialize", "Uint", 0)
   return DllCall("SetWinEventHook"
			, "Uint", __eventMin
			, "Uint", __eventMax
			, "Ptr", __hmodWinEventProc
			, "Ptr", __lpfnWinEventProc
			, "Uint", __idProcess
			, "Uint", __idThread
			, "Uint", __dwFlags)
} ; https://autohotkey.com/boards/viewtopic.php?t=830
UnhookWinEvent(__hWinEventHook) {
    __v := DllCall("UnhookWinEvent", "Ptr", __hWinEventHook)
    DllCall("CoUninitialize")
return __v
} ; https://autohotkey.com/boards/viewtopic.php?t=830
my scripts
Thorx
Posts: 98
Joined: 23 Nov 2015, 18:53

Re: Crosshair en centro de ventana activa

08 Jul 2017, 23:01

Hola : Tengo un Script Principal y para que aparezca un punto solo agrego esas lineas al inicio . Además cuando estoy jugando y paso el mouse por encima del Puntito rojo aparece la Flecha del mouse de Windows y es molestoso . Esos problemas tengo que el punto no aparece al centro y aparece la flecha del Mouse de Windows cuando paso el Mouse encima.
Este codigoo que me dio esta casi perfecto solo faltaria que aparezca al centro de la ventana activa del Juego y que la flecha del Mouse de Windows no aparezca cuando paso el mouse sobre el punto . La Ventana activa es 1152x854 en 4:3

Code: Select all

GUI, 2:-Caption +AlwaysOnTop +Owner
GUI, 2:Color, Red, Red
GUI, 2:Show, w5 h5,
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
Location: France
Contact:

Re: Crosshair en centro de ventana activa

09 Jul 2017, 08:09

Thorx wrote:Este codigoo que me dio esta casi perfecto solo faltaria que aparezca al centro de la ventana activa del Juego
Solo cambia notepad.exe por nombreDelProcesoDeTuJuego.exe en este codigo:

Code: Select all

#NoEnv
#Warn
#SingleInstance force


WinGet, ID, ID, ahk_exe notepad.exe
global AHKID := "ahk_id " . ID ; rescata y salva en ID el ID de la ventana de la bloca de notas
WinGet, PID, PID, % AHKID ; rescata y salva en PID el ID del proceso de la bloca de notas

GUI, 2:-Caption +AlwaysOnTop +Owner +hwndID ; +Owner evita que en la barra de tareas aparezca el boton de Autohotkey
GUI, 2:Color, Red, Red
GUI, 2:Show, w5 h5, 

EVENT_OBJECT_LOCATIONCHANGE := 0x800B ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd318066(v=vs.85).aspx
hWinEventHook := SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE
				, EVENT_OBJECT_LOCATIONCHANGE
				, 0
				, RegisterCallback("OnLocationChange")
				, PID
				, 0
				, 0) ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx ~ registra OnLocationChange como función de rellamada para el acontecimiento OBJECT_LOCATIONCHANGE
OnExit, exitSub
return
GuiClose:
exitSub:
UnhookWinEvent(hWinEventHook)
ExitApp

; ------------------------------------------------------------------------------------

onLocationChange(__hWinEventHook, __event, __hwnd) {

	if not (__hwnd) ; porque el sistema envia el acontecimiento tambien por el cursor si fuera necesario
return

SetWinDelay, -1

	WinGetPos, __x, __y, __w, __h, % AHKID
	GUI, 2:Show, % "NA x" . (__x+__w//2)-5 . " y" . (__y+__h//2)-5

}

; =====================================================

SetWinEventHook(__eventMin, __eventMax, __hmodWinEventProc, __lpfnWinEventProc, __idProcess, __idThread, __dwFlags) {
   DllCall("CoInitialize", "Uint", 0)
   return DllCall("SetWinEventHook"
			, "Uint", __eventMin
			, "Uint", __eventMax
			, "Ptr", __hmodWinEventProc
			, "Ptr", __lpfnWinEventProc
			, "Uint", __idProcess
			, "Uint", __idThread
			, "Uint", __dwFlags)
} ; https://autohotkey.com/boards/viewtopic.php?t=830
UnhookWinEvent(__hWinEventHook) {
    __v := DllCall("UnhookWinEvent", "Ptr", __hWinEventHook)
    DllCall("CoUninitialize")
return __v
} ; https://autohotkey.com/boards/viewtopic.php?t=830
Thorx wrote:(...)y que la flecha del Mouse de Windows no aparezca cuando paso el mouse sobre el punto .
Por lo que se trata de la flecha del mouse, que aparece por encima de la ventana, no puedo ayuadarte lo siento.... :oops:

Un saludo
my scripts
Thorx
Posts: 98
Joined: 23 Nov 2015, 18:53

Re: Crosshair en centro de ventana activa

09 Jul 2017, 15:16

Gracias , sin embargo cuando lo Integro a mi Script hay conflicto. Independentemente funciona , la idea es que pueda Integrarse con mi Script Principal ( en la parte superior ) sin activadores ni funcion de suspender o cerrar , solo activo siempre . Ahora lo integro y me aparece esta imagen
Image
El scrip principal es un rapidfire simple comun y corriente usa la tecla LButton y como activador Home , Suspender End , cerrar PgUp . Si no es mucho pedir como seria el codigo para integrarlo a un script rapidfire simple o mejor dicho que el punto permanezca mientras un solo Script Unificado este activo y sin interferirlo . Gracias
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
Location: France
Contact:

Re: Crosshair en centro de ventana activa  Topic is solved

09 Jul 2017, 17:28

Thorx wrote:Ahora lo integro y me aparece esta imagen
Yo dudo que se trata del imagen que aperece en la pantalla... Es solo una parte de ella... (de paso puedes copiar al portepapeles el contenido del calquier MsgBoxpresionando CTRL+C). Sea como sea, debo suponer y supongo que es debido al hecho que he colocado #Warn en la parte arriba del script. Puedes comentarlo, puedes prescindir de él. En cualquier caso, lo mejor me parcece ser colocar todas las funcciones, los hotkeys y las subrutinas al final del script, debajo del la parte auto-ejectutada del script (generalemente el primer returnencontrado en el script):

Code: Select all

#NoEnv
; #Warn
#SingleInstance force


; aqui puedes colocar todo lo que no forma parte, en su caso,  de una subrutina, un hotkey
;...

WinWait, ahk_exe notepad.exe ; <<< cambialo por el nombre de tu ejecutable
WinGet, ID, ID, ahk_exe notepad.exe ; <<< cambialo por el nombre de tu ejecutable
global AHKID := "ahk_id " . ID ; rescata y salva en ID el ID de la ventana de la bloca de notas
WinGet, PID, PID, % AHKID ; rescata y salva en PID el ID del proceso de la bloca de notas

GUI, 2:-Caption +AlwaysOnTop +Owner +hwndID ; +Owner evita que en la barra de tareas aparezca el boton de Autohotkey
GUI, 2:Color, Red, Red
GUI, 2:Show, w5 h5, 

EVENT_OBJECT_LOCATIONCHANGE := 0x800B ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd318066(v=vs.85).aspx
hWinEventHook := SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE
				, EVENT_OBJECT_LOCATIONCHANGE
				, 0
				, RegisterCallback("OnLocationChange")
				, PID
				, 0
				, 0) ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx ~ registra OnLocationChange como función de rellamada para el acontecimiento OBJECT_LOCATIONCHANGE
OnExit, exitSub
SetTimer, waitClose, -1
return ; fin de la parte auto-ejecutada del script


; coloca aqui tu hotkeys y subroutinas, funciones... por ejemplo:

; !i::
; codigo...
; return

; miFuncion() {
; codigo...
; }

; miSubrutina:
; codigo...
; return

waitClose:
exitSub:
WinWaitClose, ahk_exe notepad.exe ; <<< cambialo por el nombre de tu ejecutable
MsgBox
UnhookWinEvent(hWinEventHook)
ExitApp

; ------------------------------------------------------------------------------------

onLocationChange(__hWinEventHook, __event, __hwnd) {

	if not (__hwnd) ; porque el sistema envia el acontecimiento tambien por el cursor si fuera necesario
return

SetWinDelay, -1

	WinGetPos, __x, __y, __w, __h, % AHKID
	GUI, 2:Show, % "NA x" . (__x+__w//2)-5 . " y" . (__y+__h//2)-5

}

; =====================================================

SetWinEventHook(__eventMin, __eventMax, __hmodWinEventProc, __lpfnWinEventProc, __idProcess, __idThread, __dwFlags) {
   DllCall("CoInitialize", "Uint", 0)
   return DllCall("SetWinEventHook"
			, "Uint", __eventMin
			, "Uint", __eventMax
			, "Ptr", __hmodWinEventProc
			, "Ptr", __lpfnWinEventProc
			, "Uint", __idProcess
			, "Uint", __idThread
			, "Uint", __dwFlags)
} ; https://autohotkey.com/boards/viewtopic.php?t=830
UnhookWinEvent(__hWinEventHook) {
    __v := DllCall("UnhookWinEvent", "Ptr", __hWinEventHook)
    DllCall("CoUninitialize")
return __v
} ; https://autohotkey.com/boards/viewtopic.php?t=830

my scripts
Thorx
Posts: 98
Joined: 23 Nov 2015, 18:53

Re: Crosshair en centro de ventana activa

12 Jul 2017, 14:22

Gracias por la respuesta , el código independiente es impecable .

Return to “Pedir Ayuda”

Who is online

Users browsing this forum: No registered users and 20 guests