- Cambiar el estado de las ventanas a gusto.
- Mover ventanas.
- Cambiar Títulos de ventanas.
- Obtener punteros.
- Buscar Ventanas. (Devuelve el puntero si se encuentra.)
- Cambiar tamaño de las ventanas.
- Obtener títulos desde punteros.
- Obtener Punteros desde posición del mouse.
- Obtener Longitud del titulo de una ventana.
- Obtener el nombre de clase de una ventana.
- Mover Mouse.
- Bloquear Entradas de usuario. (Teclado y mouse)
- Obtener posición del mouse.
- Invertir Mouse.
- Establecer la ventana activa.
- Esconder puntero. (Mouse)
Quería agregarle la api "SendInput" que sirve para simular clics y pulsaciones de teclado, Pero no entendi NADA esa api, Re complicada :S
Aver si alguien se anima a escribirla y fixear el código (Seguro le encuentran errores), Así agregamos "Administración y Automatización de ventanas" a la lista de características de pauscal en wikipedia.
Codigo:
- Código: Seleccionar todo
'Importar "Pauscal.prp"
Importar "Cadena.prp"
'CONSTANTES.###################################################################################################################################
Const ForzarMinimizado = 11,MinimizadoForzado = 11
Const Escondido = 0,Escondida = 0,Oculto = 0,Esconder = 0
Const Maximizado = 3,Maximizada = 3,Maximizar = 3
Const Minimizado = 6,Minimizada = 6,Minimizar = 6
Const Restaurar = 9,Restaurado = 9,Restaurada = 9
Const Mostrar = 5,Visible = 5
Const DefectoVisible = 10,VisibleDefecto = 10
Const MostrarMaximizado = 3,MostrarMaximizada = 3,MaximizadoMostrar = 3,MaximizadaMostrar = 3
Const MostrarMinimzado = 2,MostrarMinimizada = 2,MinimizadoMostrar = 2,MinimizadaMostrar = 2
Const Normal = 1,Comun = 1
Const DesHabilitada = 12,DesHabilitado = 12,VentanaDesHabilitada = 12,VentanaDesHabilitado = 12,DesHabilitar = 12
Const Habilitada = 13,Habilitado = 13,Habilitar = 13,VentanaHabilitada = 13,HabilitarVentana = 13
Const Invertir = 14,Invertido = 14,Invertida = 14
'###############################################################################################################################################
'Favor de no modificar las constantes, ya que son para mayor intuicion del programador al establecer el estado de una ventana.
'Funciones de manejo del puntero.###############################################################################################################
'Private Type POINTAPI
' X As Long
' Y As Long
'End Type
Estruc POINTAPI,X,Y:Entero
'Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Proc GetCursorPos(Referencia lpPoint:POINTAPI):Entero, "User32.dll"
'BOOL WINAPI SetCursorPos(
' _In_ int X,
' _In_ int Y
');
Proc SetCursorPos(X,Y:Entero):Booleano, "User32.dll"
'int WINAPI ShowCursor(
' _In_ BOOL bShow
');
Proc ShowCursor(bShow:Booleano):Entero, "User32.dll"
'DllCall("User32.dll", "Bool", "SwapMouseButton", "Bool", 1) ; CODIGO AUTOIT SCRIPT!!! <<<<
'BOOL WINAPI SwapMouseButton( // CODIGO C++!!
' _In_ BOOL fSwap
');
Proc SwapMouseButton(fSwap:Booleano):Booleano, "User32.dll"
'###############################################################################################################################################
'Funciones de manejo del teclado.###############################################################################################################
'BOOL WINAPI BlockInput(
' _In_ BOOL fBlockIt
');
Proc BlockInput(fBlockIt:Booleano):Booleano, "User32.dll"
'###############################################################################################################################################
'Funciones de manejos de ventanas o entorno.####################################################################################################
'Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Proc FindWindow(Referencia lpClassName,lpWindowName:Cadena):Entero, "User32.dll" "FindWindowA"
'Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Proc GetWindowTextLength(hwnd:Entero):Entero, "User32.dll" "GetWindowTextLengthA"
'Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Proc GetWindowText(hwnd:Entero,Referencia lpString:Cadena,cch:Entero):Entero, "User32.dll" "GetWindowTextA"
'Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long
Proc WindowFromPoint(xpoint,ypoint:Entero):Entero, "User32.dll"
'Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClass As String, ByVal nMaxCount As Long) As Long
Proc GetClassName(hwnd:Entero,Referencia lpclass:Cadena,nMaxCount:Entero):Entero, "User32.dll" "GetClassNameA"
'BOOL WINAPI SetWindowText(
' _In_ HWND hWnd,
' _In_opt_ LPCTSTR lpString
');
Proc SetWindowText(HWND:Entero,lpString:Cadena):Booleano, "User32.dll" "SetWindowTextA"
'HWND WINAPI SetActiveWindow(
' _In_ HWND hWnd
');
Proc SetActiveWindow(hWnd:Entero):Entero, "User32.dll"
'HWND WINAPI GetActiveWindow(void);
'Proc GetActiveWindow:Entero, "User32.dll"
'BOOL WINAPI EnableWindow(
' _In_ HWND hWnd,
' _In_ BOOL bEnable
');
Proc EnableWindow(hWnd:Entero,bEnable:Booleano):Booleano, "User32.dll"
'BOOL WINAPI MoveWindow(
' _In_ HWND hWnd,
' _In_ int X,
' _In_ int Y,
' _In_ int nWidth,
' _In_ int nHeight,
' _In_ BOOL bRepaint
');
Proc MoveWindow(hWnd,X,Y,nWidth,nHeight:Entero,bRepaint:Booleano):Booleano, "User32.dll"
'typedef struct _RECT {
' LONG left;
' LONG top;
' LONG right;
' LONG bottom;
'} RECT, *PRECT;
Estruc LPRECT,Left,Top,Right,Bottom:Entero
'BOOL WINAPI GetWindowRect(
' _In_ HWND hWnd,
' _Out_ LPRECT lpRect
');
Proc GetWindowRect(hWnd:Entero,Referencia lprect:LPRECT):Booleano, "User32.dll"
'BOOL WINAPI ShowWindow(
' _In_ HWND hWnd,
' _In_ int nCmdShow
');
Proc ShowWindow(hWnd,nCmdShow:Entero):Booleano, "User32.dll"
'###############################################################################################################################################
Clase PscVentanas,LongitudText,HWNDA:Entero,TextClass1:Cadena
Privado: ' Codigo Privado de la clase u.u!
Proc ActivarVentana(hWnd:Entero)
Var ResultadoVentana:Entero
Si hWnd = 0 Entonces
Si HWNDA <> 0 Entonces
hWnd = HWNDA
SiNo
GenerarError 0,"Error - Puntero no valido."
FinSi
FinSi
ResultadoVentana = SetActiveWindow(hWnd)
Si ResultadoVentana > 0 Entonces
HWNDA = ResultadoVentana
SiNo
GenerarError 0,"Error al establecer la ventana activada."
FinSi
FinProc
Proc ObtenerCoordenadasMouseX:Entero
Var CoordenadasM:POINTAPI,ResultadoFinal:Entero
GetCursorPos(CoordenadasM)
ResultadoFinal = CoordenadasM.X
Devolver ResultadoFinal
FinProc
Proc ObtenerCoordenadasMouseY:Entero
Var CoordenadasM:POINTAPI,ResultadoFinal:Entero
GetCursorPos(CoordenadasM)
ResultadoFinal = CoordenadasM.Y
Devolver ResultadoFinal
FinProc
Proc ObtenerClaseVentana:Cadena
Var TextoClase:Cadena
TextoClase = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Si HWNDA <> 0 Entonces
Si Puntero <> 0 Entonces
GetClassName(Puntero,TextoClase,65000)
Si CadLong(TextoClase) <> 0 Entonces
Devolver TextoClase
SiNo
GenerarError 1,"Error - Error al obtener el nombre de clase."
FinSi
FinSi
SiNo
GenerarError 0, "Error - No se puede obtener el nombre de clase sin un puntero valido."
FinSi
FinProc
Proc NombClase:Cadena
Devolver TextClass1
FinProc
Proc ObtenerLongitudTituloVentana(HeadleA:Entero)
Si HeadleA = 0 Entonces
GenerarError 0,"Error - El puntero o 'Headle' no puede ser nulo"
SiNo
LongitudText = GetWindowTextLength(HeadleA)
FinSi
FinProc
Proc DevolverLongitudTituloVentana:Entero
Si LongitudText <> 0 Entonces Devolver LongitudText
FinProc
Proc Puntero:Entero
Si HWNDA <> 0 Entonces Devolver HWNDA
FinProc
Proc SetPuntero(Punter:Entero)
Si Punter <> 0 Entonces HWNDA = Punter
FinProc
Proc EstableserTexto(lpStringA:Cadena)
Var StatusWin:Booleano
Si HWNDA <> 0 Entonces
Si CadLong(lpStringA) <> 0 Entonces
StatusWin = SetWindowText(HWNDA,lpStringA)
Si StatusWin = Falso Entonces GenerarError 0,"Error al intentar cambiar el titulo."
FinSi
FinSi
FinProc
Proc LeerTitulo:Cadena
Var LetrasBuffer:Cadena,WindowTitle,i:Entero
Si HWNDA = 0 Entonces
GenerarError 0,"Error - El puntero o 'Headle' no puede ser nulo"
SiNo
ObtenerLongitudTituloVentana(HWNDA)
Contar i = 0 a LongitudText
LetrasBuffer = LetrasBuffer + "X"
Seguir
WindowTitle = GetWindowText(HWNDA,LetrasBuffer,LongitudText + 1)
Si WindowTitle <> 0 Entonces Devolver LetrasBuffer
FinSi
FinProc
Público: ' COMIENZA EL CODIGO PUBLICO!! :D
Proc PunteroDe(X,Y:Entero):Entero ' Recupera el puntero de una ventana desde la posicion del mouse en pantalla.
Var HeadlePuntero:Entero
Si X o Y <> 0 Entonces
HeadlePuntero = WindowFromPoint(X,Y)
Si HeadlePuntero = 0 Entonces
GenerarError 2, "Hadle Nulo"
SiNo
Devolver HeadlePuntero
FinSi
SiNo
GenerarError 1, "Posicion de puntero no valida."
FinSi
FinProc
Proc Buscar(VentanaNombreWindows:Cadena,Opcional NombreDeClase:Cadena = "") ' Obtiene el HWND de la ventana por su nombre si existe.
Si VentanaNombreWindows = "" Entonces
GenerarError 0,"Error - El nombre de la ventana no puede ser nulo"
SiNo
HWNDA = FindWindow(NombreDeClase,VentanaNombreWindows)
FinSi
FinProc
Proc MoverVentana(Punter,X1,Y2:Entero,Opcional Anchor1,Altura1:Entero = 0,Opcional BrRepair1:Booleano = Verd):Booleano ' Mueve una ventana.
Var EstatusMove:Booleano,Diment[]:Entero
ReDim Diment,4
Si Punter = 0 Entonces
Si HWNDA <> 0 Entonces Punter = HWNDA
FinSi
'Mensaje(Entcad(Punter)) ' Depurando Codigo :3
Diment = Dimencion(Punter)
Si (Anchor1 Y Altura1) = 0 Entonces EstatusMove = MoveWindow(Punter,X1,Y2,Diment[2] - Diment[0],Diment[3] - Diment[1],BrRepair1)
Si (Anchor1 Y Altura1) <> 0 Entonces EstatusMove = MoveWindow(Punter,X1,Y2,Anchor1,Altura1,BrRepair1)
Si EstatusMove = Verd Entonces
Devolver 1
FinSi
FinProc
Proc Dimencion(hWnd:Entero):Entero[] ' Obtiene los diametros o dimenciones de una ventana.
Var Dimenciones:LPRECT,EstatusDim:Booleano,Resultados[]:Entero
ReDim Resultados,4
'Mensaje(EntCad(hWnd)) ' Depurando codigo :D
Si hWnd = 0 Entonces
Si HWNDA <> 0 Entonces
hWnd = HWNDA
SiNo
GenerarError 0, "Error - Puntero Invalido."
FinSi
FinSi
EstatusDim = GetWindowRect(hWnd,Dimenciones)
Si EstatusDim <> Falso Entonces
Resultados[0] = Dimenciones.Left
Resultados[1] = Dimenciones.Top
Resultados[2] = Dimenciones.Right
Resultados[3] = Dimenciones.bottom
Resultado = Resultados
'Mensaje("Izquierda: " + EntCad(Resultados[0]) + " Arriba: " + EntCad(Resultados[1]) + " Derecha: " + EntCad(Resultados[2]) + " Abajo: " + EntCad(Resultados[3]),0,"Dimenciones")
FinSi
FinProc
Proc EstadoVentana(Estado:Entero,Opcional hWndB:Entero = 0):Booleano ' Esteblece el estado de una ventana.
Si hWndB = 0 Entonces hWndB = HWNDA
Si hWndB <> 0 Entonces
Si Estado = 12 Entonces EnableWindow(hWndB,Falso)
Si Estado = 13 Entonces EnableWindow(hWndB,Verd)
Si Estado <> 12 o 13 Entonces ShowWindow(hWndB,Estado)
SiNo
GenerarError 0, "Error - Puntero invalido - Nulo"
FinSi
FinProc
Proc MoverMouse(X,Y:Entero):Booleano
SetCursorPos(X,Y)
FinProc
Proc EstadoMouse(Estado:Byte) ' Establece el estado del mouse.
Si Estado = 14 Entonces SwapMouseButton(Verd)
Si Estado = 1 Entonces SwapMouseButton(Falso)
Si Estado = 0 Entonces ShowCursor(Falso)
Si Estado = 5 Entonces ShowCursor(Verd)
FinProc
Proc EstadoTeclado(Estado:Byte) ' Establece el estado del teclado.
Si Estado = 12 Entonces BlockInput(Verd)
Si Estado = 13 Entonces BlockInput(Falso)
FinProc
Prop Titulo:Cadena ' Obtiene o establece el titulo de una ventana por el puntero, HWND
Lec:LeerTitulo
Esc:EstableserTexto
FinProp
Prop HWND:Entero ' Obtiene el puntero de una ventana obtenida por el procedimiento "Buscar", Este parametro es muy importante, Ya que si a los procedimientos se les omite establecer un puntero, cada procedimiento obtiene el puntero de este procedimiento, o la variable del procedimiento.
Lec:Puntero
Esc:SetPuntero
FinProp
Prop LongTitulo:Entero ' Devuelve la longitud del titulo de una ventana.
Esc:ObtenerLongitudTituloVentana
Lec:DevolverLongitudTituloVentana
FinProp
Prop ClaseVentana:Cadena ' Obtiene la clase de una ventana por el puntero, HWND
Lec:ObtenerClaseVentana
FinProp
Prop MouseX:Entero ' Obtiene la coordenada X del puntero en pantalla. (Mouse) - Izquierda o Derecha
Lec:ObtenerCoordenadasMouseX
FinProp
Prop Activar:Entero
Esc:ActivarVentana
FinProp
Prop MouseY:Entero' Obtiene la coordenada Y del puntero en pantalla. (Mouse) - Arriba o Abajo
Lec:ObtenerCoordenadasMouseY
FinProp
FinClase
' CODIGO DE PRUEBA, NECESITA SER COMPILADO!
'Var Administrar:PscVentanas
'Crear Administrar
'Eval Administrar
' .Buscar("Pauscal")
' .EstadoVentana(Visible,.HWND)
' Pausar(1000)
' .MoverVentana(.HWND,50,30)
' Pausar(1000)
' .Titulo = "Hola Mundo, Cambie el titulo Y?"
' Pausar(5000)
' .Titulo = .ClaseVentana
' Pausar(2000)
' .MoverMouse(40,152)
'FinEval
'Destruir Administrar
'Fin
Un saludo!