hola, queria ver como podria hacer para que si un programa externo este minimizado o maximizado mi programa haga una cosa o otra, he estado buscando en internet pero no lo encuentro, gracias
hola, queria ver como podria hacer para que si un programa externo este minimizado o maximizado mi programa haga una cosa o otra, he estado buscando en internet pero no lo encuentro, gracias
hola no se muy bien con Maximizado , pero si te sirve con (minizado) y estado (normal y maximizado) pudes usar dos apis findwindow y isiconic
lo unico que tienes que averiguar es el nombre clase de probrama que dices o bien usar su caption para findwindow
con un timer1 en el formulario
si te es muy importante lo de maximizado una forma que se me ocurre es con el api GetWindowRect que bien esta de debuelve la posicion y el ancho y alto de la ventna y si esta esta coinside con el area del escritorio, esto ultimo (el area del escritorio)lo puedes saver en este enlace que puse en la guia de recursosCódigo:Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long Private Sub Form_Load() Timer1.Interval = 50 Shell "notepad.exe" End Sub Private Sub Timer1_Timer() WinWnd = FindWindow("Notepad", vbNullString) Me.Caption = IIf(IsIconic(WinWnd) = 0, "Normal", "Minimizado") End Sub
http://www.canalvisualbasic.net/foru....asp?TID=30054
bien es muy provable casi un 99% que la ventana este maximizada.
Saludos
Hola Leandro: Alguna idea para minimizar todas las pantallas de aplicaciones externas que estan abiertas?
SALU2 D DESSA
... si consigues hacer con sendkeys o similar que se pulsen 'virtualmente' la combinación de
Tecla Windows + M
y luego darle a la tuya el foco...
estará solucionado.
Con Enumwindows() listarias las ventanas obteniendo su hwnd y con ShowWindow() y la constante SW_MINIMIZE las minimizarias. Es mas efectivo que emular pulsaciones. No lo he probado pero creo que seria asi el codigo, esto en un proyecto con un simple modulo BAS:
Salu2...Código:Option Explicit Private Const SW_MINIMIZE As Long = 6 Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long ' Punto de entrada de la aplicacion: Private Sub Main() Call EnumWindows(AddressOf IconicWindowsProc, ByVal 0&) End Sub ' Esta funcion es recursiva mediante EnumWindows(): Private Function IconicWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean ' Minimizamos la ventana si no lo esta ya: If Not CBool(IsIconic(hwnd)) Then Call ShowWindow(hwnd, SW_MINIMIZE) ' Continua enumerando ventanas: EnumWindowsProc = True End Function
Cada vez que se alinean los planetas me paso de visita por el foro
dx_lib32: Programa juegos en Visual Basic 6.0 y Visual Basic .NET con la potencia de DirectX 8.1
Version 2.2.0 final publicada
Hola EX3, no entendí : ¿ Falta definir la función EnumWindowsProc ?
SALU2
hola,yo tengo este codigo para minimizar las ventanas.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Const WM_COMMAND = &H111
Const MIN_ALL = 419
Const MIN_ALL_UNDO = 416
Sub MinimizeAllWindows(Optional Restore As Boolean)
Dim hWnd As Long
hWnd = FindWindow("Shell_TrayWnd", vbNullString)
If Restore Then
SendMessage hWnd, WM_COMMAND, MIN_ALL_UNDO, ByVal 0&
Else
SendMessage hWnd, WM_COMMAND, MIN_ALL, ByVal 0&
End If
End Sub
Private Sub Form_Load()
MinimizeAllWindows False
End Sub
ojala le sirva a alguien.
saludos.
Todos somos ignorantes;lo que pasa es que no todos ignoramos las mismas cosas - Albert Einstein
Buenísimo Sebas.
Salu2 d Alguien
bueno aca un codigo mas interesante,necesita 2 botones,uno minimiza todo y el otro restaura las ventanas.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_COMMAND As Long = &H111
Private Const MIN_ALL As Long = 419
Private Const MIN_ALL_UNDO As Long = 416
Public Sub MinimizarTodo()
Dim lngHwnd As Long
lngHwnd = FindWindow("Shell_TrayWnd", vbNullString)
Call PostMessage(lngHwnd, WM_COMMAND, MIN_ALL, 0&)
End Sub
Public Sub RestaurarTodo()
Dim lngHwnd As Long
lngHwnd = FindWindow("Shell_TrayWnd", vbNullString)
Call PostMessage(lngHwnd, WM_COMMAND, MIN_ALL_UNDO, 0&)
End Sub
Private Sub Command1_Click()
MinimizarTodo
End Sub
Private Sub Command2_Click()
RestaurarTodo
End Sub
Edited by: seba123neo
Todos somos ignorantes;lo que pasa es que no todos ignoramos las mismas cosas - Albert Einstein
Mejor todavia, Sebas, tenesla constante delWM_COMMAND como para cerrar todo?
Call PostMessage(lngHwnd, WM_COMMAND, ??CERRAR TODO??, ??)
no se si se podrian cerrar todas las ventanas de golpe.
Const WM_CLOSE = &H10
esa constante haria eso de cerrar las ventanas,pero no se como implementarlo en mi ejemplo,y lo probe como vos querias y no funciona.yo tengo un ejemplo de como cerrar una ventana sabiendo su nombre de clase,o sea cerrar las ventanas pero cada una por separado.
Todos somos ignorantes;lo que pasa es que no todos ignoramos las mismas cosas - Albert Einstein
Leandro, tengo un problema,modifique tu codigo pero no me deja ejecutarlo, dice que esta mal, mira ver que pasa, porfavor:Iniciado por Leandro
Código:Private Sub Timer1_Timer() WinWnd = FindWindow("Notepad", vbNullString) Me.Hide = IIf(IsIconic(WinWnd) = 0, "Minimizado") End Sub
hola soru13 Te falta una parte de la condición
Private Sub Timer1_Timer()
WinWnd = FindWindow("Notepad", vbNullString)
Me.Caption = IIf(IsIconic(WinWnd) = 0, "Normal", "Minimizado")
End Sub
PD:Funciona perfecto
Dessa, el codigo que me dio Leandro funciona perfectamente, pero yo necesito que el form se oculte, y lo hice asi
Private Sub Timer1_Timer()
WinWnd = FindWindow("Notepad", vbNullString)
Me.Hide = IIf(IsIconic(WinWnd) = 0, "Minimizado")
End Subel "normal" se puede quitar
Haber si con esta condición
Private Sub Timer1_Timer()
WinWnd = FindWindow("Notepad", vbNullString)
If IsIconic(WinWnd) = 0 Then
Me.Hide
Else
Me.Show
End If
End Sub
PD : es un ejemplo, tenes que adaptarlo a lo que queres hacer
No, simplemente que el codigo original la funcion recursiva EnumWindowsProc la rebautice a IconicWindowsProc, se me olvido cambiar el codigo de retorno. Un consejo, si decis de usar este codigo, añadir la siguiente rutina de comprobacion u os llevareis una desagradable sorpresa al ejecutarloIniciado por Dessa
De la otra forma, como todo elemento en Windows es una ventana os armara un cirio como una catedral mostrando ventanas de programas que ni si quiera la tienen o son simples iconos de la barra de tareas sobrecargando los recursos del sistema, un "bonito" espectaculo caotico (ya dije que ni probe el codigo... hasta hace unos minutosCódigo:Private Declare Function IsWindow Lib "user32" Alias "IsWindow" (ByVal hwnd As Long) As Long Private Declare Function IsWindowEnabled Lib "user32" Alias "IsWindowEnabled" (ByVal hwnd As Long) As Long Private Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" (ByVal hwnd As Long) As Long ' Nos aseguramos de verdad de que se trate de una ventana real, visible y que este activa como minimo: If CBool(IsWindow(hwnd)) And CBool(IsWindowEnabled(hwnd)) And CBool(IsWindowVisible(hwnd)) Then ... la comprobacion negativa mediante IsIconic() del codigo anterior que puse)
Salu2...
Cada vez que se alinean los planetas me paso de visita por el foro
dx_lib32: Programa juegos en Visual Basic 6.0 y Visual Basic .NET con la potencia de DirectX 8.1
Version 2.2.0 final publicada
'De la única manera que logré minimizar es la sig
Option Explicit
Private Const SW_MINIMIZE As Long = 6
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
' Punto de entrada de la aplicacion:
Private Sub Main()
Call EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
End Sub
' Esta funcion es recursiva mediante EnumWindows():
Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
' Minimizamos la ventana si no lo esta ya:
If CBool(IsWindow(hwnd)) And _
CBool(IsWindowEnabled(hwnd)) And _
CBool(IsWindowVisible(hwnd)) Then
If Not CBool(IsIconic(hwnd)) Then Call ShowWindow(hwnd, SW_MINIMIZE)
End If
' Continua enumerando ventanas:
EnumWindowsProc = True
End Function
' y en el form
Option Explicit
Private Sub Form_Load()
End
End Sub
'SALU2
Edited by: Dessa
Otra forma es usando las teclas de sistema. Lo que no me acuerdo es que onda en versiones anteriores
un Timer
Código:Option Explicit Private Declare Sub keybd_event Lib "user32" ( _ ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, _ ByVal dwExtraInfo As Long) Private Sub Form_Load() Timer1.Interval = 3000 End Sub Private Sub Timer1_Timer() keybd_event 91, 2, 0, 0 keybd_event 77, 2, 0, 0 End Sub
Hay alguna manera de ejecutar "C:\windows\system32\Mostrar escritorio.scf" (que no es mas ni menos que el ícono "mostrar escritorio" de la barra de inicio)
Estaría bueno porque con esta opción se minimizarían todas las ventanas visibles, aún las que no tienen botón de minimizar.
PD: el código de Seba123neo parece bueno y bastante directo (solamente no minimiza las ventanas que no tienen boton de minimizar)
SALU2
Edited by: Dessa
eso mismo estaba pensando yo lo del icono Mostrar Escritorio ,yo tengo el iconito en la barra de tareas y lo uso siempre cuando tengo muchas ventanas maximizadas y quiero ir al escritorio entonces me minimiza todo.tambien me minimiza las ventanas de las propiedades y la de el explorador de proyectos en el entorno de visual basic,ya que para minimizar las ventanas hijas del entorno de diseño de visual basic no se puede hacer minimizando la ventana padre y siempre me quedan las hijas visibles ypara que se minimizen junto a la padre tengo que darle el foco a una de las hijas y minimizar el padre y ahi si las minimiza todas.un lio total,pero con el iconito ese se soluciona todo,porque minimiza todo las padres y las hijas.
Todos somos ignorantes;lo que pasa es que no todos ignoramos las mismas cosas - Albert Einstein
hola una forma de minizar todas las ventanas es una que use con la barra de tareas, ademas se puede poner en cascada,horizontal,vertical
Agrega la referencia Microsoft Shell Controls And Automation
Código:Dim oShell As Shell32.Shell Private Sub Command1_Click() oShell.MinimizeAll End Sub Private Sub Command2_Click() oShell.TileHorizontally End Sub Private Sub Command3_Click() oShell.TileVertically End Sub Private Sub Command4_Click() oShell.CascadeWindows End Sub Private Sub Form_Load() Set oShell = New Shell32.Shell Command1.Caption = "Minimizar todo" Command2.Caption = "Mosaico Horizontal" Command3.Caption = "Mosaico Vertical" Command4.Caption = "Cascada" End Sub Private Sub Form_Unload(Cancel As Integer) Set oShell = Nothing End Sub
U otra mas facil utilizando Mostrar Escritorio del QuickLaunch
SaludosCódigo:Private Sub Command1_Click() Dim QuickLaunch As String QuickLaunch = Environ("APPDATA") & "\Microsoft\Internet Explorer\Quick Launch\" Shell ("rundll32.exe url.dll,FileProtocolHandler " & QuickLaunch & "Mostrar escritorio.scf") End Sub
Edited by: Leandro
Bien Leandro, eso estaba buscando (ejecutar "Mostrar escritorio.scf") , en windows Me (en 98 me imagino que tambien) funciona con:
Private Sub Command1_Click()
Shell ("rundll32.exe url.dll,FileProtocolHandler " & "Mostrar escritorio.scf")
End Sub
En vista no funcionóninguna de las dos y en XP no puedo probar por el momentopero me imagino que es donde probaste vos.
GRANDE LEAN
Editado: ya lo arregle... xD
gracias por la ayuda de todos
Edited by: soru13
EX3: estoy intentando (con tu código y sendmenssage) cerrar todas las ventanas (visibles o minimizadas) aparentemente cierra todo lo que encuentra (bien), pero la primera ventana que intenta cerrar es la de "salir de windows". ¿ alguna idea para que en la condición (antes de sendMenssage) se pueda saltear esta ventana ?
Option Explicit
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_SYSCOMMAND = &H112
Private Const SC_CLOSE = &HF060&
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
' Punto de entrada (ejecutar desde este módulo)
Private Sub Main()
Call EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
End Sub
Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal hWnd2 As Long) As Boolean
If CBool(IsWindow(hwnd)) And _
CBool(IsWindowEnabled(hwnd)) And _
CBool(IsWindowVisible(hwnd)) Then
Call SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, CLng(0))
End If
EnumWindowsProc = True
End Function
'PD: respondío igual en win Me, xp y vista
'SALU2
Edited by: Dessa
Hola lo puedes hacer con GetWindowLong esta te debuelve el estilo de ventana y si la ventana tiene borde y es visible le ordenas que la cierre
SaludosCódigo:Option Explicit Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Const WM_SYSCOMMAND = &H112 Private Const SC_CLOSE = &HF060& Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As Long) As Long Const GWL_STYLE = (-16) Const Win_VISIBLE = &H10000000 Const Win_BORDER = &H800000 Const IsTask = Win_VISIBLE Or Win_BORDER ' Punto de entrada (ejecutar desde este módulo) Private Sub Main() Call EnumWindows(AddressOf EnumWindowsProc, ByVal 0&) End Sub Private Function EnumWindowsProc(ByVal hWnd As Long, ByVal hWnd2 As Long) As Boolean If TaskWindow(hWnd) Then Call SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, CLng(0)) EnumWindowsProc = True End Function Function TaskWindow(hwCurr As Long) As Long Dim lngStyle As Long lngStyle = GetWindowLong(hwCurr, GWL_STYLE) If (lngStyle And IsTask) = IsTask Then TaskWindow = True End Function