PDA

Visualizza la versione completa : [C++] trovare HWND da HANDLE a processo o da Process Id


kirakira93
13-06-2010, 18:32
mmm...mi sa che non devo spiegare niente.....non ho idee su come farlo....ho rovistato MSDN e Google ma niente da fare!

Aiuto

linoma
13-06-2010, 20:01
ma se nn riesci a trovare API elenca le windows e controlla con il tuo id del processo.

kirakira93
14-06-2010, 11:15
Spiego meglio:
Io ho due exe:
il primo avvia 30 volte il primo
il secondo crea una finestra ogni volta che si avvia.

Il problema è che il secondo processo deve capire chi è il primo processo che è stato avviato.
Quindi un processo avrà una variabile tipo questa: bSonoStatoAvviatoPerPrimo = TRUE, mentre gli altri 29 avranno questa bSonoStatoAvviatoPerPrimo = FALSE.

Se io uso la FindWindow() non lavora bene perchè visto che i processi devono essere avviati uno dopo l'altro senza Sleep() accade questo:

("=>" significa "di conseguenza")

Processo1): FindWindow() ritorna NULL => bSonoStatoAvviatoPerPrimo = TRUE (Tutto ok )
Processo2): FindWindow() ritorna comunque NULL perchè il primo processo non ha ancora chiamato la CreateWindow()=> bSonoStatoAvviatoPerPrimo = TRUE (MALE! il processo avviato per primo è solo 1! )
Processo3): Lo stesso per Processo2)

/*Vari processi che si comportano come Processo2*/

Finalmente): Processo1 chiama la CreateWindow(), ma ormai è troppo tardi....


Se ci fosse quella API ho ideato un metodo abbastanza veloce è robusto.....però non la trovo :D..... bhe adesso che avete capito il problema a fondo, come potrei fare?

linoma
14-06-2010, 11:21
Puoi usare anche un'oggetto nominativo, cioe che ha un ID univoco all'interno del sistema, normalmente si usa un mutex, e se esiste significa che il processo è avviato.
Attenzione la visibilita' dell'oggetto in alcuni casi puo' non funzionare adesso nn ricordo bene i casi specifici ma sono molto limitati.

kirakira93
15-06-2010, 16:43
Grazie....comunque sono riuscito a risolvere con un enumwindow() e altri stratagemmi che non sto qui a spiegare percè sono abbastanza comlpessi...comunqe prover la mutex
Ciao

MItaly
15-06-2010, 21:52
Fidati che conviene il mutex; per il nome "unico", usa un GUID (o il nome del tuo programma seguito da un GUID).

oregon
15-06-2010, 22:03
Originariamente inviato da MItaly
Fidati che conviene il mutex; per il nome "unico", usa un GUID (o il nome del tuo programma seguito da un GUID).

Concordo ...

kirakira93
15-06-2010, 22:12
mmm ho provato a leggere la documentazione.....e non ho capito niente!!!
potreste spiegarmi un po' meglio perfavore....

kirakira93
16-06-2010, 00:58
avevo letto per sbaglio la documentazione del .NET....ebbene ora ho capito cos'è un mutex....e (anche se un po' meno cos'è un GUID).....

Domanda1 :D come potrei usare un Mutex (che si rivelerebbe utile:D) visto che qui non si lavora con più trhead ma con più processi?

Domanda2 :D come posso usare il GUID....che li mi sono sforzato di capire un possibile impiego ma non l'ho trovato :D

ps evviva la faccia :D

MItaly
16-06-2010, 01:06
1. È lo stesso, i mutex dotati di nome sono oggetti globali.
2. I GUID sono identificatori più o meno garantiti come universalmente unici (una bassissima probabilità di collisione c'è, ma è risibile); visto che il nome del mutex dovrà essere unico nel sistema, inserendo nel suo nome un GUID ti cauteli da eventuali conflitti con altre applicazioni, che potrebbero generarsi se due applicazioni cercassero di usare un mutex con lo stesso nome, senza sapere che, oltre a loro, ci sta accedendo un'altra applicazione. Per questo dunque ti conviene includere nel nome del mutex un GUID che puoi generare al volo da siti come questo (http://www.somacon.com/p113.php).

Loading