Richiamare la visualizzazione di un form di un altro processo e monito...

giovedì 04 febbraio 2010 - 11.26

ysdemarc Profilo | Expert

Ho un programma in c#.net che viene richiamato da un programma VB6.

al momento del lancio del programma VB6 questi si occupa di lanciare il mio programma c# che si riduce nella system tray.

l'utente può attivare il programma facendo un doppio click nell'icona della system tray e dovrebbe pure poterlo fare da un pulsante di comando del programma VB6 inoltre dovrebbe monitorare l'esistenza del programma VB6 ed eventualmente non trovandolo in esecuzione terminarsi anch'esso.

Problemi:
1) Io riesco a capire che il programma c# è già in esecuzione e a non eseguire quindi un'altra istanza. ma come faccio nel caso sia già in esecuzione a riportarlo visibile a video?
2) vorrei monitorare i processi come ad esempio per le directory abbiamo la FileSystemWahtcher si può? vorrei evitare di usare il timer o cicli strani per cercare di non assorbire troppa cpu nella richiesta. Qualche idea?


Vincenzo
Programmatore sbilenco

tonyexpo Profilo | Senior Member

Ciao

da VB6 credo tu possa sapere se il programma è già in esecuzione solo tramite le API di windows, ma non saprei al volo la funzione, poi sempre con le API dovresti portare il form in foreground

per il FileSystemWatcher, si fa al caso tuo perchè espone dei semplici eventi per intercettare data una cartella eventuali file aggiunti/modificati etc......



Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos

ysdemarc Profilo | Expert

Forse mi sono espresso male...

poichè non posso modificare il programma in VB6 devo gestire tutto dal mio in c#.net

già in c# riesco a capire che c'è un'altra istanza del mio programma e quindi a non caricarne un'altra..però vorrei attivare e rendere visibile a schermo l'istanza già presente

cioè da vb6 mi caricano da riga di comando ed io vado nella system tray.. poi sempre da vb6 con un pulsante di comando rilanciano il mio programma.. a questo punto mi accorgo che già sono in esecuzione ed allora mi visualizzo sullo schermo.

per il secondo problema non è che voglio monitorare file e directory ma i processi in esecuzione (come ad esempio fa il FileSystemWatcher che non consuma cpu) in modo che se il programma VB6 si chiama pincopallino.exe e va in crash, non sarà più in esecuzione, e quindi termino anche il programma c#

spero di essere stato pèiù chiaro..

grazie comunque..

ciaooo

Vincenzo
Programmatore sbilenco

tonyexpo Profilo | Senior Member

Ciao

capito tutto


allora: puoi fare tutto con un semplice metodo della classe Process:
Process p = Process.GetProcessesByName("myappinvb6")[0]; //senza .exe
questo medoto di torna il processo VB6 chiamante

basta gestire l'evento Exited facendo p.Exited += processExited;

e ti crei il gestore d'evento
void processExited(object sender, EventArgs e)
{ esco dal programma C# }


per verificare invece se altre istanze del tuo programma sono in esecuzione puoi facilmente verificare che Process.GetProcessesByName("nomeprogrammac#").Length==1;
altrimenti esci dal programma


aggiornaci presto
ciao





Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos

ysdemarc Profilo | Expert

allora come hai detto tu ho scritto questo..

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Lancio il tutto..poi chiudo l'applicazione VB6 ma della MessageBox neanche l'ombra

Inoltre io non voglio solamente uscire se il pgm c# viene chiamato un'altra volta.. ma visto che si trova nella system tray, vorrei attivare e visualizzare a video quello già lanciato...
Vincenzo
Programmatore sbilenco

tonyexpo Profilo | Senior Member


uhm...
per pilotare l'altra istanza della tua applicazione esistono dei metodi: il più semplice è usare qualche valore persistito su DB, filesystem, namedpipe da usare come punto di interscambio per comandi tra una istanza e l'altra... (es: doMaximixe), altrimenti esistono tecniche dedicate come il vecchio Remoting o il WCF


per l'evento dovrebbe funzionare, il codice non mi sembra errato ad occhio

verifica che l'applicazione non sia in qualche modo bloccata dall'esecuzione di altro, o in fase di sleep del thread


tienici aggiornati
ciao

Antonio Esposito
MCTS, MCP

http://blogs.dotnethell.it/espositos

ysdemarc Profilo | Expert

Al momento ho risolto in questo modo..cosa che avevo pensato ma mi rifiutavo di utilizzare..

in pratica ho messo un timer con un intervallo di 1000 millisecondi...

quando il mio pgm viene richiamato più volte scrivo un file di 0kb da qualche parte ed esco.

nel frattempo l'istanza precedente col timer controlla se il form è visibile o meno se non visibile controlla se esiste il file..a questo punto va in primo piano sullo schermo e cancella il file.

per gestire l'evento Exited alla dichiarazione del processo bisogna abilitare gli eventi con
miprocesso.EnableRaisingEvents = true;

ecco perchè non funzionava..
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5