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

Seleccione idioma Seleccione idioma
Id. de artículo: 176391 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se describe cómo utilizar las funciones de la API para cerrar mediante programación una sola instancia de la mayoría de los programas de Windows a través de un 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 completan todas las tareas de programa.

Más información

Para cerrar mediante programación una sola instancia de un programa de Windows, utilice la función FindWindow de para obtener el identificador a la ventana que desea 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 coinciden con los parámetros de cadena. La función FindWindow devuelve el identificador de la ventana como un valor long si es correcta 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 bien -

    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 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 una cola de mensaje del programa, que devuelve un valor inmediatamente. Esta función devuelve un valor que no sea cero si es correcta y devuelve un valor 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 largo está disponible como resultado de la función FindWindow .
  • uInt - el mensaje para exponer en la cola de mensajes. En este programa, utilice el mensaje se ha 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 demasiado pronto en el evento, un problema de sincronización puede producirse que hace que el programa salga antes de procesar el mensaje. Cuando se utiliza la función WaitForSingleObject , esto asegura que el mensaje está procesado 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 en infinito , el intervalo de tiempo de espera de la función nunca transcurre.
La función WaitForSingleObject requiere un identificador de proceso es diferente de un hWnd . Debe llamar a GetWindowThreadProcessId para determinar el ProcessID y luego pasarla a la función OpenProcess para obtener un identificador de proceso.

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

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

Crear el programa de ejemplo

Esta sección describe cómo crear un programa de ejemplo que muestra cómo utilizar código de Visual Basic para cerrar un programa de ejecución. El programa de ejemplo se inicia 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 a 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 calculadora de Windows, haga clic en Cerrar la calculadora .

Referencias

Para obtener información adicional, haga clic en los números de artículo correspondientes para verlos en Microsoft Knowledge Base:
129797Cómo iniciar una aplicación Win32 desde Visual Basic
129796Cómo utilizar una aplicación de 32 bits para determinar cuándo termina un proceso de shell
Para obtener información adicional, vea ambas de las acciones siguientes:
  • Documentación de Platform SDK en funciones FindWindow y PostMessage
  • Guía del programador de Visual Basic 5.0 de la API de Win32

Propiedades

Id. de artículo: 176391 - Última revisión: jueves, 01 de julio de 2004 - Versión: 2.1
La información de este artículo se refiere a:
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Palabras clave: 
kbmt kbapi kbhowto KB176391 KbMtes
Traducción automática
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

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com