Newsgroup: it.comp.lang.visual-basic
Titolo: sapere quante volte è aperto un programma

supponiamo che compili un exe semplicissimo, tipo un form con un pulsante di
chiusura.
supponiamo che voglia lanciare più volte contemporaneamente questo
eseguibile, ma che il colore di sfondo del form vari ad ogni lancio...
la domanda, in poche parole è: è possibile sapere quante volte lo stesso
programma è in esecuzione in un dato momento?
grazie

 programma č in esecuzione in un dato momento?
Se sai cosa c'č scritto nel titolo della tua finestra, sě!
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal
wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Const GW_HWNDNEXT = 2
Dim test_hwnd as long
Dim MyStr As String
Dim sTitolo as string
Dim lContoOccorrenze aS LONG
    MyStr = String(100, Chr$(0))
    'Trova la prima finestra
    test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
    Do While test_hwnd <> 0
       'Se non č una finestra figlia
       If GetParent(test_hwnd) = 0 Then
         'Testo della finestra
         GetWindowText test_hwnd, MyStr, 100
         sTitolo = Left$(MyStr, InStr(MyStr, Chr$(0)) - 1)
         If Stitolo="Il titolo della mia applicazione" then
            lContoOccorrenze=lContoOccorrenze+1
         Endif
       End If
       'prossima finestra
       test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
    MsgBox "Numero di occorrenze del programma in memoria: " &
lContoOccorrenze
Ciao
*Roby*
P.S:
Scritto al volo e non provato. La logica č quella comunque.

"ezio" ha scritto nel messaggio

Ci potrebbero essere varie soluzioni, dalle più complicate alle più
semplici. Potresti, ad esempio, leggere la task list del sistema.
Ma la soluzione più semplice e rapida che mi viene in mente,
è di leggere e incrementare un contatore in un file o meglio
ancora in una chiave del registro ad ogni apertura del programma
(per poi decrementarlo ad ogni uscita, ovviamente).
Un punto da notare è che se il tuo programma dovesse inchiodarsi
e non uscire normalmente, per un qualunque motivo, il conteggio
sarebbe sbagliato; per mettere una pezza a questo problema,
potresti controllare la proprietà App.PrevInstance.
Se è False, azzeri il contatore.
Bye, G.

grazie delle risposte ragazzi, non si finisce mai di imparare

 programma č in esecuzione in un dato momento?
Prova a vedere qui:
http://vbsimple.virtualave.net/index.htm?http://vbsimple.virtualave.net/howt
o/032.htm

Più facile ancora:
In FormLoad metti
If App.PrevInstance = True Then
        'quello che vuoi tu
End If

 Se č False, azzeri il contatore.
se lo stesso exe e' lanciato da due dir diverse, direi sia falsa
comunque.

 comunque.
... oh, cacchio. Ciairaggione, ciai. :-(
Ho fatto un paio di prove e hai ragione.
Non ci avevo pensato, perché in genere l'app sul sistema
è unica, ma qualcuno potrebbe anche decidere di installarla
due volte in tue cartelle diverse.
Allora l'unica è quella di Roberto Piazzolla, semprechè
il titolo della finestra non cambi. Per esempio in un paio
di editor di testo che ho fatto, il titolo cambia, viene
aggiunto il nome del file aperto... però la prima parte,
il nome del programma, rimane fissa. Dovrebbe funzionare.
Non credo che a nessuno dei miei utOnti venga in mente
di fare qualcosa di simile... anche perché in genere le
installazioni le fanno i sistemisti. Gli utOnti normali, su w2k,
hanno giusto i permessi necessari per soffiarsi il naso,
se gli firmo un pezzo di carta che li abilita. :->
Bah. :-(
Intanto, per sicurezza, mi tocca fare gli aggiornamenti
su tutti i programmi in uso. :-(((
Bye, G.

 su tutti i programmi in uso. :-(((
altro consiglio ricavato dalla frequentazione di sistemisti con la
sindrome da internet: i programmi sensibili, e che vanno, non
aggiornarli. non aggiornarli mai, fidati... :P
regole del manager neosistemista (in corso di pubblicazione):
1. i dischi NON si partizionano MAI. pena trovarsi 3 gb di \programmi
su un disco da 30g ma in una partizione di 1.5g. tanto in caso di
crash e' il disco che si rompe, non la partizione, e in caso di
reinstall le cose importanti, come il cdplayer.ini, andranno cmq
perse, trovandosi in \win. e quando ho spostato il pagefile in G: si
e' poi incazzato photoshop perche', improvvido, ci avevo a suo tempo
gia' messo il suo swap personale. per risparmiare spazio su c:,
naturalmente...
2. appena installato un pc da consegnare, portarselo a casa e andarci
a letto insieme per almeno una settimana. e comunque COLLAUDARLO nelle
reali e normali condizioni d'uso. il login admin non e' considerabile
una normale condizione d'uso, a pena di diventarlo.
3. una volta raggiunto un accettabile compromesso con l'hw-sw di cui
si dispone, mettersi l'animo in pace. ulteriori miglioramenti verranno
dal proprio apprendimento personale, e dallo svolgimento del
normalissimo lavoro d'ufficio, quasi certamente NON da aggiornamenti
di release pari con release dispari, che invece miglioreranno le
proprie conoscenze sistemistiche ma costringeranno a lavorare ai docs
di notte...
4.1. ogni volta che si fa un login "administrator", chiedersi perche'
la mamma di bill gates nel momento del piacere massimo non poteva dare
un nome lungo e indigitabile a lui e un login corto tipo "su" a noi.
4.2. dato che la digitazione del login dura l'iradiddio, ci si puo'
anche chiedere perche' a 2002 quasi terminato, e con 384m di ram a
bordo, non sia ancora possibile aprire una console (io la chiamo
finestra dos, ma al systemista gli viene ogni volta una syndrome) da
"su". e possibilmente una gui piena, senza per questo sloggare o
parcheggiare l'utente corrente (si fa per dire. normalmente l'user e'
dichiarato static).
ciao, j.sys

 di fare qualcosa di simile...
E non potresti utilizzare il registro di sistema e accedere alla stessa
chiave da tutte le copie del programma in modo da sapere se è già stato
installato, quando, ecc?
O qualche altra informazione che adesso non mi viene in mente...

 il titolo della finestra non cambi.
Se l'applicazione l'hai fatta tu, puoi usare lo stesso trucco che uso io.
Per ogni programma creo una form con un nome fisso e univoco, che apro alla
partenza dell'applicazione (dopo il test di preesistenza, ovviamente) fuori
dallo spazio della finestra video. In alternativa puoi aprirla nascosta, va
bene lo stesso.
Quella finestra il titolo non lo cambia di certo, e ti fa da semaforo
sicuro.
Se invece sono applicazioni di terze parti, ti devi accontentare di cercare
la prima parte del titolo della finestra, quella che non cambia anche quando
apri un documento diverso.
Ciao
*Roby*

 apri un documento diverso.
ah, come quelle di ie e word intendi ?
eh, queste terze partacce... :P
ciao, a.

 dichiarato static).
RunAs non ti basta ? Per le installazioni e altre cose semplici, va.
Bye, G.

 RunAs non ti basta ? Per le installazioni e altre cose semplici, va.
hmmm... testato con sistemista e c++ista,
mancava il vbista ma non era importante, tanto se proprio serve
telefono luca
no, troppo limitato.
con 400-1000 mb di ram io desidero, voglio, pretendo un nuovo desktop
gui con diritti da admin mentre e' loggato l'user.
fino a quel momento win non sara' un sistema come si deve.
dall'alto delle mie competenze a ms posso intanto suggerire lo switch:
win-f1, win-f2 ecc.
difficile che ne servano piu' di 12 insieme :P
ciao, a.

 si deve.
XP lo fa.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 XP lo fa.
dimmi che e' pienamente vero e mi farai felice.
il sistemista diceva che puoi 'parcheggiare' l'utente, senza chiudere
i programmi, e loggarti come admin. ma e' lievemente diverso.
io vorrei vivo e vegeto anche l'utente.
almeno, a volte... :P
ciao, a.

 almeno, a volte... :P
Ovvero? Tu hai due (o più) utenti loggati, ma ovviamente sullo
stesso monitor puoi avere un solo utente attivo alla volta
(troverei difficoltoso il contrario). Un po' come le finestre:
puoi averne molte aperte, ma solo una è attiva (e riceve
l'imput dell'utente).


 l'imput dell'utente).
esistono quei programmi che ti fanno avere mi sembra fino a 9 desktop
vivi.
me ne basterebbero due, un desktop con permessi user e uno con admin.
quando configuro o collaudo una macchino ogni volta perdo minuti
preziosi a uscire e rientrare.
in nx non c'e' ^f1, ^f2 ?
in questo momento su 384 mb ne ho 250 liberi.
nel mondo nt non dovrebbe essere impossibile.
ciao, a.

 nel mondo nt non dovrebbe essere impossibile.
Io, per ottenere lo stesso risultato in Win200 utilizzo un
programma fornito insieme al SDK (Desktop Switcher), che crea
nuovi desktop e permette di navigare fra di loro. Poi avvio
Explorer (tutta la shell) come diverso utente in un nuovo
desktop. Solo che ci sono alcuni programmi che si avviano in
automatico insieme alla shell, che creano problemi in caso
vengano eseguiti più di una volta.


 nuovi desktop e permette di navigare fra di loro.
mitico, come al solito.
grazie, a.