[BCB] message z tekstem do okna innej aplikacji...

0

Witam,

mój programik, zgodnie z założeniam, nie uruchamia się w dwóch instancjach. Musi natomiast, gdy ktoś bedzie chciał uruchomic go "po raz drugi" przekzazać parametr (z którym został uruchomiony) do pierwszej swojej instancji...
Realizuję to za pomocą komunikatu np.:

#define WM_MEET (WM_APP + 23)

...i gdy to uruchomienie po raz drugi nastepuje, odnajduję uchwyt okna pierwszej instancji (FindWindow) i wysyłam komunikat:

SendMessage(hwnd, WM_MEET,(unsigned int) parametr,0);   //paramter to char[MAX_PATH]

i nic się nie dzieje :| Komunikat przechwytuję tak:
w private:

MESSAGE void __fastcall WMMEET(TMessage &Message);

i cialo funkcji:

MESSAGE void __fastcall TForm1::WMMEET(TMessage &Message)
{
        //TForm1::Dispatch( (void*)&Message );
        if (Message.Msg == WM_MEET)
        {
                char *s = (char *) (Message.WParam);
                ShowMessage(s);
        }
}

Jestem pewien, że uchwyt okna jest znajdowany poprawnie i to tyle, co do czego jestem pewien - zwykle piszę w delphi i nie mam większego doświadczenia w C++. W czym problem?

0

A nie mozesz pokazac MessageBox'a podajac w pierwszym parametrze uchwyt okna pierwszej instancji programu?

0
SendMessage(hwnd, WM_MEET,(unsigned int) parametr,0);   //paramter to char[MAX_PATH]

A cóż to jest??
Tak się nie da [green]
Bo niby gdzie mają zostać przechowane dane, na które wskazuje parametr?

Do tego służy specjalna struktura + komunikat. Wygląda to tak:

char text[200];
strcpy(text, "tu tekst do wysłania, oczywiście można podać jakiś wskaźnik");
COPYDATASTRUCT CopyData = {0, strlen(text) + sizeof(char), text};
SendMessage(hWnd, WM_COPYDATA, long(Handle), long(&CopyData));

gdzie hWnd to uchwyt okna, do którego wysyłamy a Handle to uchwyt okna wysyłającego.

Odbieranie:

void __fastcall TfMessageRecive::ObslugaKomunikatu(TMessage &Msg)
{DWORD CountData, FPassedData;
 PCOPYDATASTRUCT PassedCopyDataStruct;
 PassedCopyDataStruct = reinterpret_cast<COPYDATASTRUCT*>(Msg.LParam);
 CountData = PassedCopyDataStruct->cbData;
 if (CountData > 0)
 {text = new char[CountData];
  if (PassedCopyDataStruct->lpData != NULL)
   memmove(text, PassedCopyDataStruct->lpData, CountData);
 }

 Win32Check( ReplyMessage(true) );

 Memo->Lines->Add(text); //tu jakiś przykład wykorzystania otrzymanych danych
 delete[] text;
}

Jak masz Buildera, to obadaj przykład "Examples\Controls\SingleInst\singleappinstance" - dokładnie to, co robisz - przekazywanie parametru z drugiej instancji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1