Newsgroup: it.comp.programmare.win32
Titolo: Singola Instanza

Come faccio ad avere la singola instanza di un applicativo ???
Io ho fatto cosě ma mi crea dei problemi:
  HANDLE hInstanceMutex = ::CreateMutex( NULL, true, "PIPPO.MUTEX");
  if( GetLastError() == ERROR_ALREADY_EXISTS )
  {
    if( hInstanceMutex )
      CloseHandle( hInstanceMutex );
    Application->Title = "PIPPO";
    HWND hPrevApp = ::FindWindow( NULL, Titolo.c_str() );
    if( hPrevApp )
    {
      WriteFileName();
      PostMessage( hPrevApp, WM_MYMESSAGE, 0, 0 );
      PostMessage( hPrevApp, WM_ACTIVATE, 0, 0 );
      ShowWindow(hPrevApp, IsIconic(hPrevApp) ? SW_RESTORE :
SW_SHOWDEFAULT);
      BringWindowToTop( hPrevApp );
      SetForegroundWindow( hPrevApp );
    }
  }
  else
  {
    try
    {
           Application->ProcessMessages();       // per aggiornare i campi
sul video
           Application->Initialize();
           Application->Title = PIPPO;
           Application->CreateForm(__classid(TMainForm), &MainForm);
.....
....
     }
}
Come dicevo mi crea problemi in particolare:
lancio l'applicativo, lo riduco ad icona,
provo a rilaniare l'applicativo e il programma giustamente riappare con una
singola instanza,
ma il problema č che ora non č piu' possibile ridurre l'applicativo nella
barra delle applicazioni !!!!
Aiuto e suggerimenti grazie

 Come faccio ad avere la singola instanza di un applicativo ???
[cut]
Io ti consiglio di usare la EnumWindows (callback API) e ricercare il titolo
della finestra del tuo programma con FindWindow. Se lo trovi, dai un
messaggio è chiudi!
L'ho usata per intercettare acrobat reader e chiuderlo. Devo dire che
funziona bene.
Ciao
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 messaggio è chiudi!
probabilmente nn gli interessa chiudere un'eventuale istanza già
esistente, ma terminare in inizializzazione se un'istanza è già avviata.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 esistente, ma terminare in inizializzazione se un'istanza è già avviata.
esatto

 nella barra delle applicazioni !!!!
Ciao!
In genere io adotto uno stratagemma differente: invece di portare in primo 
piano la prima istanza *dalla* seconda, "dico" *alla* prima istanza di 
tornare in primo piano, mediante un messaggio registrato.
Ti posto questo codice, adattato da un mio programma che gira sotto NT2KXP.
Non so se negli adattamenti ho tralasciato qualcosa, è solo per darti 
un'idea su come puoi risolvere il problema.
// Registrazione Messaggio Interno per comunicare in broadcast
// un GUID in Borland C++ si genera con Ctrl-Shift-G
#define ONEISTANCEMSG "Nome Applicazione GUID"
UINT oneistancemsg = RegisterWindowMessage (ONEISTANCEMSG);
// Controllo Esecuzioni Multiple
HANDLE hMutex = OpenMutex (MUTEX_ALL_ACCESS, FALSE, ONEISTANCEMSG);
 
if (NULL == hMutex)
{
  CreateMutex(NULL, TRUE, ONEISTANCEMSG);
}
else
{
  // Notifica per riportare in primo piano.
  CloseHandle (hMutex);
  PostMessage (HWND_BROADCAST, oneistancemsg, 0, 0);
  return 0;
}
// e qui continui con l'esecuzione (prima istanza)
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
Poi in una form (ho visto ke usi il builder) metti un gestore di messaggi:
void __fastcall TForm1::appeventsMessage(tagMSG &Msg, bool &Handled)
{/*
   Risponde al messaggio privato ONEISTANCEMSG per la finestra 
dell'applicazione.
*/
        Handled = false;
        if (oneistancemsg == Msg.message)
          if (Msg.hwnd == Application->Handle)
          {
                  FlashWindow (Application->Handle, TRUE);
                  Sleep(450);
                  FlashWindow (Application->Handle, TRUE);
                  Sleep(450);
                  FlashWindow (Application->Handle, TRUE);
                  Sleep(450);
                  Application->Restore();
                  PostMessage (GetDesktopWindow(),WM_SYSCOMMAND, SC_HOTKEY, 
(long) Application->Handle);
                  Handled = true;
          }
}
Ciao!!
-- 
Davide DG.