Red de conocimiento informático - Conocimiento informático - Cómo organizar los siguientes efectos; consulte la página interior para obtener más detalles. puntuación alta

Cómo organizar los siguientes efectos; consulte la página interior para obtener más detalles. puntuación alta

El principio es simple, simplemente busque si la aplicación ya existe en los programas en ejecución, si existe, actívela; de lo contrario, iníciela para que se ejecute.

Un método simple es crear un objeto mutex (API CreateMutex) usando el nombre del archivo de ejecución de la aplicación, de modo que cada vez que el programa comience a ejecutarse, si la creación falla, significa que la aplicación se está ejecutando, mediante un bucle. a través de todos los programas en ejecución en el sistema operativo y comparando sus propiedades, busque la ventana en ejecución y actívela. De lo contrario, significa que no había ninguna copia de la aplicación ejecutándose anteriormente, así que simplemente inicie y ejecute el programa normalmente.

API clave:

CreateMutex()

SetProp()

GetProp()

Puedes pasar Archivo de ayuda para comprender la descripción de la API anterior

El siguiente es un fragmento de VC, que proporciona el código relacionado BOOL CXXXApp:.InitInstance() (devolver FALSE significa que la aplicación sale):

m_pszExeName es el nombre del archivo ejecutable de la aplicación

::CreateMutex(NULL, TRUE, m_pszExeName);

if( GetLastError() == ERROR_ALREADY_EXISTS)

{

//Busca la ventana principal de la aplicación anterior

CWnd* pPrevWnd = CWnd:.GetDesktopWindow()-gt GetWindow(GW_CHILD);

while(pPrevWnd)

{

// ¿Está configurada la marca de instancia anterior para esta ventana?

if (::GetProp(pPrevWnd-gt; GetSafeHwnd(), m_pszExeName))

{

//Busca la ventana y establece el foco en la ventana

//Si la ventana es actualmente un icono, restaure la ventana primero.

if(pPrevWnd-gt;IsIconic())

pPrevWnd-gt;ShowWindow(SW_RESTORE);

//Establecer foco en la ventana principal

p>

pPrevWnd-gt; SetForegroundWindow();

//Si la ventana tiene una ventana emergente, establezca el foco en emergente.

pPrevWnd-gt; pPrevWnd -gt

//========gt;gt;gt;gt;gt;gt; ;lt;= =======

return FALSE;

}

/ Ventana no encontrada, obtiene la siguiente ventana de la lista.

pPrevWnd = pPrevWnd-gt; GetWindow(GW_HWNDNEXT);

}

TRACE("¡No se pudo encontrar la ventana principal de la instancia anterior!\n");

Devuelve FALSE;

}

/Creando la ventana principal

CMainFrame* pMainFrame = new CMainFrame;

m_pMainWnd = pMainFrame;

if (!pMainFrame-gt; LoadFrame(IDR_MAINFRAME))

Devuelve FALSE;

//La ventana principal tiene inicializado, muéstrelo y actualícelo. p>

pMainFrame-gt;ShowWindow(m_nCmdShow);

pMainFrame-gt;UpdateWindow();

// Asocia una etiqueta con la ventana para que Nosotros podrás encontrarlo más tarde.

::SetProp(pMainFrame-gt; GetSafeHwnd(), m_pszExeName, (HANDLE)1);

//No encontrado, sigue haciendo lo que hay que hacer...

p>

//...

Adicional:

1. Al encontrar la aplicación en ejecución original, es mejor utilizar el nombre del archivo ejecutable de la aplicación. porque el título de la ventana puede cambiar durante la ejecución del programa

2. Puntero o identificador de la ventana), puede enviarle datos o mensajes

3. Justo ahora, depende de lo que estés usando VB (supongo que se agregó al escribir el texto anterior), escribí especialmente un fragmento de código VC (trabajo duro), de hecho, ya sea vc o vb, el principio es Lo mismo, así que no lo volveré a escribir, ¡solo entiéndelo!