Cómo cerrar mediante programación una sola instancia de un programa basado en Windows

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 176391
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Resumen
Este artículo describe cómo utilizar API funciona para cerrar mediante programación una sola instancia de Windows más programas a través de su programa de Microsoft Visual Basic. Puede utilizar esta característica para iniciar un programa, para ejecutar el programa sin intervención del usuario y para salir del programa cuando se hayan completado todas las tareas del programa.
Más información
Para cerrar mediante programación una sola instancia de un programa de Windows, utilice la funciónFindWindow para obtener el identificador de la ventana que desee cerrar. La función FindWindow devuelve el identificador de una ventana de nivel superior con un nombre de clase y un nombre de ventana que coincidan con los parámetros de cadena. La función FindWindow devuelve el identificador de la ventana como un valor de tipo long si tiene éxito, y devuelve el identificador de la ventana como un valor nulo si se produce un error. Para utilizar FindWindow, debe proporcionar los dos parámetros siguientes:
  • lpClassName : un puntero a una cadena terminada en null que especifica el nombre de clase

    - o -

    una cadena terminada en null que es un átomo que identifica la cadena de nombre de clase.

    En este programa, puede pasar vbNullString.
  • lpWindowName : un puntero a una cadena terminada en null que especifica el nombre de la ventana (el título de la ventana).
Utilice el controlador para enviar un mensaje para cerrar la ventana con la función PostMessage. La función PostMessage envía un mensaje a un programa messagequeue, que devuelve un valor inmediatamente. Esta función devuelve un non-zerovalue si tiene éxito, y devuelve un valor de cero si se produce un error.

Para utilizar la función PostMessage , debe especificar los cuatro parámetros siguientes:
  • hWnd - identificador de la ventana que desea cerrar.

    Este valor long está disponible como resultado de la función FindWindow .
  • uInt : el mensaje a la cola de mensajes. En este programa, utilice el mensaje WM_CLOSE.
  • wParam : el primer parámetro de mensaje. Para este mensaje, pasar un valor null.
  • lParam - el segundo parámetro de mensaje. Para este mensaje, pasar un valor null.
Si envía un mensaje muy pronto en el evento, puede ocurrir un problema de sincronización que hace que el programa se cierre antes de procesar el mensaje. Cuando se utiliza la función WaitForSingleObject , esto garantiza que el mensaje se procesa antes de que el programa se cierra.

Para utilizar la función WaitForSingleObject , debe especificar los dos parámetros siguientes:
  • hHandle - el identificador del objeto que desea supervisar.
  • dwMilliseconds - especifica el intervalo de tiempo de espera en milisegundos.

    Si establece este parámetro a infinito, el intervalo de tiempo de espera de la función nunca transcurre.
La función WaitForSingleObject requiere un identificador del proceso, que es diferente de un hWnd. Debe llamar a GetWindowThreadProcessId para determinar el ID de proceso y, a continuación, se pasa a la función OpenProcess para obtener un identificador de proceso.

Para asegurarse de que se cierra el programa, utilice la función IsWindow para determinar si el identificador no es válido. La función IsWindow devuelve un valor distinto de cero si el identificador es válido y devuelve un valor de cero si el identificador no existe.

Para utilizar la función IsWindow, especificar el identificador para comprobar. Si todavía existe el controlador, puede utilizar la función TerminateProcess para detener el proceso de identificador. Sin embargo, Microsoft recomienda que utilice este enfoque extreme. Aunque se haya detenido el proceso de identificador, las bibliotecas de vínculos dinámicos (DLL) que utilizan el controlador aún pueden residir en memoria, lo que provoca una pérdida de memoria. Utilice la función TerminateProcess con precaución.

Crear el programa de ejemplo

En esta sección se describe cómo crear un programa de ejemplo que muestra cómo utilizar código de Visual Basic para salir de un programa en ejecución. La programstarts muestra y detiene el programa Calculadora de Windows.

Para crear el programa de ejemplo, siga estos pasos:
  1. Inicie un nuevo proyecto EXE estándar en Visual Basic. De forma predeterminada, se crea Form1.
  2. Agregue dos controles CommandButton a Form1.
  3. Copie el código siguiente en la ventana código de Form1:
          Option Explicit      Private Declare Function WaitForSingleObject Lib "kernel32" _         (ByVal hHandle As Long, _         ByVal dwMilliseconds As Long) As Long      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 Declare Function IsWindow Lib "user32" _         (ByVal hwnd As Long) As Long      Private Declare Function OpenProcess Lib "kernel32" _         (ByVal dwDesiredAccess As Long, _         ByVal bInheritHandle As Long, _         ByVal dwProcessId As Long) As Long            Private Declare Function GetWindowThreadProcessId Lib "user32" _         (ByVal hwnd As Long, _         lpdwProcessId As Long) As Long      'Constants that are used by the API      Const WM_CLOSE = &H10      Const INFINITE = &HFFFFFFFF      Const SYNCHRONIZE = &H100000      Private Sub Form_Load()         Command1.Caption = "Start the Calculator"         Command2.Caption = "Close the Calculator"      End Sub      Private Sub Command1_Click()      'Starts Windows Calculator         Shell "calc.exe", vbNormalNoFocus      End Sub      Private Sub Command2_Click()      'Closes Windows Calculator         Dim hWindow As Long         Dim hThread As Long         Dim hProcess As Long         Dim lProcessId As Long         Dim lngResult As Long         Dim lngReturnValue As Long         hWindow = FindWindow(vbNullString, "Calculator")         hThread = GetWindowThreadProcessId(hWindow, lProcessId)         hProcess = OpenProcess(SYNCHRONIZE, 0&, lProcessId)         lngReturnValue = PostMessage(hWindow, WM_CLOSE, 0&, 0&)         lngResult = WaitForSingleObject(hProcess, INFINITE)         'Does the handle still exist?         DoEvents         hWindow = FindWindow(vbNullString, "Calculator")         If IsWindow(hWindow) = 1 Then            'The handle still exists. Use the TerminateProcess function            'to close all related processes to this handle. See the            'article for more information.            MsgBox "Handle still exists."         Else            'Handle does not exist.            MsgBox "All Program Instances Closed."         End If      End Sub					
  4. Presione F5 para ejecutar el programa.
  5. Para iniciar el programa Calculadora de Windows, haga clic en iniciar la calculadora.

    Para salir del programa de la calculadora de Windows, haga clic en Cerrar la calculadora.
Referencias
Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
129797 Cómo iniciar una aplicación Win32 desde Visual Basic
129796 Cómo utilizar una aplicación de 32 bits para determinar cuándo termina un proceso de shell
Para obtener información adicional, consulte lo siguiente:
  • Documentación de Platform SDK en FindWindow y PostMessage funciones
  • Guía del programador de Visual Basic 5.0 a la API Win32
Terminar la documentación de Platform SDK

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 176391 - Última revisión: 12/05/2015 08:10:01 - Revisión: 3.0

Microsoft Visual Basic 5.0 Enterprise Edition, Microsoft Visual Basic 5.0 Learning Edition, Microsoft Visual Basic 5.0 Professional Edition, Microsoft Visual Basic 6.0 Professional Edition

  • kbnosurvey kbarchive kbapi kbhowto kbmt KB176391 KbMtes
Comentarios