Abrir Soft dentro de mi Form..

Iniciado por Pitoniso, 17 Noviembre 2006, 15:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

Pitoniso

Pos eso gente quiero ejecutar un Soft desde mi programa...o sea no es ejecutarlo y ya, mas bien hacer que trabaje sobre mi Programa...como si fuese un FOrm mas...algo asi...

Espero que me hallan entendido...

CeLaYa

en el visual 5, viene un ejemplo de como ejecutar la calculadora de windows dentro de un MDIForm, deberias de revisarlo.
"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.


-POLACO-

Hola viejo aca te dejo un code de El Guille ,yo lo recorte bastante y funciona joya.
Podes ejecutar cualquier .exe dentro del picture.
En Un form pones 1 picture box="picR" y un boton="Command1" .
El codigo completo va en el Formulario chao espero te sirva .-.



Option Explicit

Private objDer As PictureBox
Private hndNotepad As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'------------------------------------------------------------------------------
' APIS para incluir las ventanas en un PictureBox
'------------------------------------------------------------------------------

' Para hacer ventanas hijas
Private Declare Function SetParent Lib "user32" _
    (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
'
' Para mostrar una ventana según el handle (hwnd)
' ShowWindow() Commands
Private Enum eShowWindow
    HIDE_eSW = 0&
    SHOWNORMAL_eSW = 1&
    NORMAL_eSW = 1&
    SHOWMINIMIZED_eSW = 2&
    SHOWMAXIMIZED_eSW = 3&
    MAXIMIZE_eSW = 3&
    SHOWNOACTIVATE_eSW = 4&
    SHOW_eSW = 5&
    MINIMIZE_eSW = 6&
    SHOWMINNOACTIVE_eSW = 7&
    SHOWNA_eSW = 8&
    RESTORE_eSW = 9&
    SHOWDEFAULT_eSW = 10&
    MAX_eSW = 10&
End Enum

Private Declare Function ShowWindow Lib "user32" _
    (ByVal hWnd As Long, ByVal nCmdShow As eShowWindow) As Long
'
' Para posicionar una ventana según su hWnd
Private Declare Function MoveWindow Lib "user32" _
    (ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
'
' Para saber si una ventana es hija de otra
Private Declare Function IsChild Lib "user32" _
    (ByVal hWndParent As Long, ByVal hWnd As Long) As Long

Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Type RECTAPI
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type WINDOWPLACEMENT
    Length As Long
    Flags As Long
    ShowCmd As Long
    ptMinPosition As POINTAPI
    ptMaxPosition As POINTAPI
    rcNormalPosition As RECTAPI
End Type

Private Declare Function GetWindowPlacement Lib "user32" _
    (ByVal hWnd As Long, ByRef lpwndpl As WINDOWPLACEMENT) As Long

' Mostrar el formulario indicado, dentro de picDock
Private Sub dockForm(ByVal formhWnd As Long, _
                     ByVal picDock As PictureBox, _
                     Optional ByVal ajustar As Boolean = True)
    ' Hacer el formulario indicado, un hijo del picDock
    ' Si Ajustar es True, se ajustará al tamaño del contenedor,
    ' si Ajustar es False, se quedará con el tamaño actual.
    Call SetParent(formhWnd, picDock.hWnd)
    posDockForm formhWnd, picDock, ajustar
    Call ShowWindow(formhWnd, NORMAL_eSW)
End Sub

' Posicionar el formulario indicado dentro de picDock
Private Sub posDockForm(ByVal formhWnd As Long, _
                        ByVal picDock As PictureBox, _
                        Optional ByVal ajustar As Boolean = True)
    ' Posicionar el formulario indicado en las coordenadas del picDock
    ' Si Ajustar es True, se ajustará al tamaño del contenedor,
    ' si Ajustar es False, se quedará con el tamaño actual.
    Dim nWidth As Long, nHeight As Long
    Dim wndPl As WINDOWPLACEMENT
    '
    If ajustar Then
        nWidth = picDock.ScaleWidth \ Screen.TwipsPerPixelX
        nHeight = picDock.ScaleHeight \ Screen.TwipsPerPixelY
    Else
        ' el tamaño del formulario que se va a posicionar
        Call GetWindowPlacement(formhWnd, wndPl)
        With wndPl.rcNormalPosition
            nWidth = .Right - .Left
            nHeight = .Bottom - .Top
        End With
    End If
    Call MoveWindow(formhWnd, 0, 0, nWidth, nHeight, True)
End Sub

Private Sub Command1_Click()

    Call Shell("calc.exe", vbNormalFocus) '<<<Podes cambiar por el programa que quieras vos
    '
    Dim s As String
   
    'hndNotepad = FindWindow(s, "Sin título - Bloc de notas")
    hndNotepad = FindWindow(s, "Calculadora") '<<<<--Titulo de la Ventana
    'si es false se ve el exe tal cual es             LEERRRR
    'si es true se ajusta a la ventana bakan
    dockForm hndNotepad, objDer, False
End Sub



Private Sub Form_Load()
   
    Set objDer = picR
   
End Sub




Podemos ser lo mejor y tambien lo peor con la misma facilidad.   Bersuit Vergarabat -POLACO-


Pitoniso

Cita de: -POLACO- en 21 Noviembre 2006, 04:46 AM
Hola viejo aca te dejo un code de El Guille ,yo lo recorte bastante y funciona joya.
Podes ejecutar cualquier .exe dentro del picture.
En Un form pones 1 picture box="picR" y un boton="Command1" .
El codigo completo va en el Formulario chao espero te sirva .-.



Option Explicit

Private objDer As PictureBox
Private hndNotepad As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'------------------------------------------------------------------------------
' APIS para incluir las ventanas en un PictureBox
'------------------------------------------------------------------------------

' Para hacer ventanas hijas
Private Declare Function SetParent Lib "user32" _
    (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
'
' Para mostrar una ventana según el handle (hwnd)
' ShowWindow() Commands
Private Enum eShowWindow
    HIDE_eSW = 0&
    SHOWNORMAL_eSW = 1&
    NORMAL_eSW = 1&
    SHOWMINIMIZED_eSW = 2&
    SHOWMAXIMIZED_eSW = 3&
    MAXIMIZE_eSW = 3&
    SHOWNOACTIVATE_eSW = 4&
    SHOW_eSW = 5&
    MINIMIZE_eSW = 6&
    SHOWMINNOACTIVE_eSW = 7&
    SHOWNA_eSW = 8&
    RESTORE_eSW = 9&
    SHOWDEFAULT_eSW = 10&
    MAX_eSW = 10&
End Enum

Private Declare Function ShowWindow Lib "user32" _
    (ByVal hWnd As Long, ByVal nCmdShow As eShowWindow) As Long
'
' Para posicionar una ventana según su hWnd
Private Declare Function MoveWindow Lib "user32" _
    (ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
'
' Para saber si una ventana es hija de otra
Private Declare Function IsChild Lib "user32" _
    (ByVal hWndParent As Long, ByVal hWnd As Long) As Long

Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Type RECTAPI
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type WINDOWPLACEMENT
    Length As Long
    Flags As Long
    ShowCmd As Long
    ptMinPosition As POINTAPI
    ptMaxPosition As POINTAPI
    rcNormalPosition As RECTAPI
End Type

Private Declare Function GetWindowPlacement Lib "user32" _
    (ByVal hWnd As Long, ByRef lpwndpl As WINDOWPLACEMENT) As Long

' Mostrar el formulario indicado, dentro de picDock
Private Sub dockForm(ByVal formhWnd As Long, _
                     ByVal picDock As PictureBox, _
                     Optional ByVal ajustar As Boolean = True)
    ' Hacer el formulario indicado, un hijo del picDock
    ' Si Ajustar es True, se ajustará al tamaño del contenedor,
    ' si Ajustar es False, se quedará con el tamaño actual.
    Call SetParent(formhWnd, picDock.hWnd)
    posDockForm formhWnd, picDock, ajustar
    Call ShowWindow(formhWnd, NORMAL_eSW)
End Sub

' Posicionar el formulario indicado dentro de picDock
Private Sub posDockForm(ByVal formhWnd As Long, _
                        ByVal picDock As PictureBox, _
                        Optional ByVal ajustar As Boolean = True)
    ' Posicionar el formulario indicado en las coordenadas del picDock
    ' Si Ajustar es True, se ajustará al tamaño del contenedor,
    ' si Ajustar es False, se quedará con el tamaño actual.
    Dim nWidth As Long, nHeight As Long
    Dim wndPl As WINDOWPLACEMENT
    '
    If ajustar Then
        nWidth = picDock.ScaleWidth \ Screen.TwipsPerPixelX
        nHeight = picDock.ScaleHeight \ Screen.TwipsPerPixelY
    Else
        ' el tamaño del formulario que se va a posicionar
        Call GetWindowPlacement(formhWnd, wndPl)
        With wndPl.rcNormalPosition
            nWidth = .Right - .Left
            nHeight = .Bottom - .Top
        End With
    End If
    Call MoveWindow(formhWnd, 0, 0, nWidth, nHeight, True)
End Sub

Private Sub Command1_Click()

    Call Shell("calc.exe", vbNormalFocus) '<<<Podes cambiar por el programa que quieras vos
    '
    Dim s As String
   
    'hndNotepad = FindWindow(s, "Sin título - Bloc de notas")
    hndNotepad = FindWindow(s, "Calculadora") '<<<<--Titulo de la Ventana
    'si es false se ve el exe tal cual es             LEERRRR
    'si es true se ajusta a la ventana bakan
    dockForm hndNotepad, objDer, False
End Sub



Private Sub Form_Load()
   
    Set objDer = picR
   
End Sub




Podemos ser lo mejor y tambien lo peor con la misma facilidad.   Bersuit Vergarabat -POLACO-



Como bien dices es una joya, ahora el tratamiento de las ventanas con el findwindow no puede hacerse por ejemplo con un proceso X, o sea q lo busque y revise si el mismo tiene alguna ventana abierta....y si la tiene que la oculte en este caso...

saludos..

dime si sabes trabajar con el reg e windows...

-POLACO-

Disculpa pero no entendi bien cuando decis  "Proceso X" ¿¿no te referis a un servicio no ??
Si No es un servicio podes poner un timer que chequee cada x tiempo si el titulo de la ventana de tu "Proceso X" existe .
Si existe ahi tenes el handle de la ventana ,no se si podras ocultarlo pero terminarlo si que podras.

Hay otra manera que te da todas las ventanas activas con su respectivo handle(Lista todas las ventanas).

Me preguntas si se trabajar con el registro del win ,SI se.

Si podes explicate mejor con algun ejemplo de ¿ que queres que haga tu programa ? con respecto a los datos que pueda sacar del "Proceso X" .

El Proceso X ,es otro programa hecho por vos ??
Un saludo

Pitoniso

Cita de: -POLACO- en 23 Noviembre 2006, 04:11 AM
Disculpa pero no entendi bien cuando decis  "Proceso X" ¿¿no te referis a un servicio no ??
Si No es un servicio podes poner un timer que chequee cada x tiempo si el titulo de la ventana de tu "Proceso X" existe .
Si existe ahi tenes el handle de la ventana ,no se si podras ocultarlo pero terminarlo si que podras.

Hay otra manera que te da todas las ventanas activas con su respectivo handle(Lista todas las ventanas).

Me preguntas si se trabajar con el registro del win ,SI se.

Si podes explicate mejor con algun ejemplo de ¿ que queres que haga tu programa ? con respecto a los datos que pueda sacar del "Proceso X" .

El Proceso X ,es otro programa hecho por vos ??
Un saludo

Si bueno en unas de mis explicaciones en otro Tema era que desde mi soft, hago un llamado mediante el Shell en conjunto de unos parametros que admite el soft externo y el mismo me responde con una serie de eventos que no dejan de estar al alcance de ser controlados o supervisados, como algun mensaje de advertencia, error, en fin, lo que sucede es que normalmente el muestra una ventana con informacion delicada que no me cuadra que se muestre por eso vengo a ocultarlo...tambien dicha ventana por X motivos quizas se le pase un parametro mal u algo puede demorarse en mostrarse por lo que tengo que tener mucho cuidado a la hora de buscarla para que se me oculte, si pense en un Timer solo que se me vino a la mente que como una especie de escaneo para saber si el mismo tiene una o varias ventanas activas y ocultarlas...no buscar una o unas especificamente...

Necesito agregar un fichero .Reg.. al Registro de Windows, estuve trasteando la Api RegLoadKey despues de un mete y saca no logre hacer nada pero segun estuve leyendo sus caracteristicas y me dice que no puedo agregar nada al HKEY_CURRENT_USER.... bueno tirame un ojito ahi haber que onda....si quieres te busco el escrito que lei de la misma ayuda del Visual Basic...espero por ti...thx

-POLACO-