La siguiente es la versión Delphi de la solución
(Método 1) Cualquiera que use mutex para desarrollar software multiproceso puede haber usado mutex. Los mutex son un medio técnico de uso común. sincronización entre hilos. Para mencionar brevemente el mutex, el programa que lo creó por primera vez se considera el programa principal. De esta manera, solo necesita detectar si el mutex ya tiene un programa principal para determinar si el programa se ha ejecutado. Aquí es necesario involucrar una función API WaitForSingleObject, su primer parámetro. El número es el primer parámetro del mutex que se probará y representa el tiempo que se debe mantener antes de que la función devuelva el resultado. Si la función devuelve wait_TimeOut, significa que el mutex ya tiene un programa principal.
Tenga en cuenta que el siguiente código aparece en el archivo del proyecto, no en el archivo de la unidad: hwnd start? //CreateMutex crea un mutex y le da un nombre único. mi exclusión mutua: = crear exclusión mutua (nil false OneCopy);? //¿El programa aún no se está ejecutando? if WaitForSingleObject(my mutex) lt; ¿Qué pasa con wait_TimeOut? ¿comenzar? Inicialización de la aplicación;? ApplyCreateForm (formulario TForm);? Aplicación en ejecución;? End; end; [Nota]
Cuando la aplicación se ejecuta por primera vez, se establecerá un mutex llamado OneCopy en la aplicación y luego se determinará si existe este mutex en el sistema. En caso contrario, inicialice la aplicación.
Mejoremos este programa.
No queremos que el programa se ejecute muchas veces, pero esperamos que si el programa se ejecuta nuevamente, el programa que ya se está ejecutando responda, por ejemplo convirtiéndolo en la ventana activa superior para recordarle al usuario que el El programa se está ejecutando. Para lograr esto, debemos obtener un identificador para el programa en ejecución y luego usar APISetForeGroundWindow (identificador). Para controlar el programa, se utiliza la función de enumeración de Windows EnumWindows para recorrer la lista de ventanas. Esta función toma una función de devolución de llamada como parámetro y se llama para cada ventana del sistema hasta que la última ventana o la función de devolución de llamada devuelve falso. Simplemente escriba esta función de devolución de llamada para comparar continuamente el nombre de la clase de ventana actualmente atravesada con el nombre de la clase de ventana principal de nuestro programa, compare el nombre del archivo ejecutable de la ventana con el nombre de nuestro programa, hasta que se encuentre el mismo, y luego guarde el ventana en este momento manejar. Para obtener el nombre y el identificador de la clase de ventana, necesita un APIGetClassName y, para obtener el nombre del archivo ejecutable, necesita un APIGetModuleFileName.
El siguiente es el código detallado
Tenga en cuenta que el siguiente código se ejecuta en Delphi, pero si ejecuta el programa nuevamente después de minimizar la ventana, puede activar el programa ejecutado anteriormente. , pero no se puede utilizar el botón de minimizar de la barra de título. Probé el método en N y supongo que es un problema con la clase TForm de Delphi. A continuación se muestra una solución para colocar un control ApplicationEvents en la ventana que administra todos los mensajes de la aplicación.
¿Deberíamos escribir el siguiente código en su evento OnMessage? Si msghwnd = identificador de formulario, entonces comienza // ¿Hiciste clic con el mouse en la barra de título? // ¿Hiciste clic con el mouse en el botón minimizar de la barra de título? ? Si (Msg message=) y (msg wParam=), ¿entonces? ? ¿comenzar? ? EstadoVentanaFormulario:=? ws¿Minimizado? ? Fin; fin;
Lishi Xinzhi/Article/program/Delphi/201311/24832