Newsgroup: it.comp.lang.visual-basic
Titolo: [?][API] Come si trova il ClassName?

Dunque, facciamo piccoli passi avanti :)
Il problema e' sempre quello di controllare che non ci siano altre
istanze del mio programma in esecuzione e in seguito mandargli un
messaggio personalizzato.
Allora, per vedere se c'e' gia' un'istanza in esecuzione ho pensato di
fare cosi':
1. il programma parte e controlla se nel registro c'e' una chiave
2. se non c'e', la crea e questo significa che e' la prima istanza
3. se c'e', il programma controlla la validita' del dato salvato nella
chiave e se e' valido si chiude e passa il  controllo alla prima
istanza, facendole avere, tramite un messaggio personalizzato, gli
eventuali parametri della linea di comando --che saranno sempre e solo
nomi di files da aprire--
4. la prima istanza, diciamo ogni 10 secondi o giu' di li', aggiorna
la chiave nel registro
5. quando esco, il programma cancella la chiave dal registro
In questo modo limito la validita' temporale della chiave, cosa
importante se per caso il programma va in crash e non cancella la
chiave quando esce. Il side effect sara' che al massimo per 10 secondi
non riesco a riavviare il programma perche' quando lo riavvio vedo,
per 10 secondi, una chiave ancora valida.
Ora veniamo al problema del messaggio personalizzato. Per spedire un
messaggio personalizzato ho bisogno prima di tutto di trovare la
window procedure della prima istanza. Per farlo, uso FindWindow:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
dove i parametri sono:
- lpWindowName, il titolo della finestra --noto--
- lpClassName, che non so e non so come trovare.
Per fare qualche prova, ho inserito nel codice una GetClassName:
Public Declare Function GetClassName Lib "user32" Alias
"GetClassNameA" ( _
    ByVal hwnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Il problema, pero', e' che quando la chiamo non mi ritorna niente. Ho
fatto un
    a = GetClassName(Me.hwnd, tmp, 255)
    errore = GetLastError()
Debug.Print "ClassName: "; tmp
Debug.Print "RetValue:  "; a
Debug.Print "Errore:    "; errore
e nel debug vedo:
ClassName: 
RetValue:   0 
Errore:     0 
che non e' proprio proprio confortante...
Dove sto sbagliando?
Saluti che mi scuso ma VB con l'API proprio non riesco ancora a
maritarli :)
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD

 2. se non c'e', la crea e questo significa che e' la prima istanza
oppure che il tuo amato win98 e' crollato una volta di piu',lasciando a
meta' le chiavi nel registro...
questo e' il problema coi flag del genere. un pro(grammatore)
pro(fessionista) adattando a win un prg dos di cui non volevo lanciassero
piu' finestre e' riuscito a risolverla solo con un msgbox: "sei sicuro che
non sia gia' aperto?".
pochissimo professionale. ma l'ha scritto lui :)
ora, non so con win9: con nt/2k il taskman da' l'elenco dei processi in
corso-
p.e. in questo momento ci vedo mcafee:
-- mcshield.exe
-- vshwin.exe
-- vsstat.exe ' direi sia mcafee anche questo.
mi sa che sia piu' sicuro cercare li' dentro se trovi il tuo rondinini.exe.
o sei tu oppure e' primavera :)
in alternativa, metti in runonce un exe che come prima cosa pulisca il
registro dalla chiave incriminata.
non so se ci siano metodi piu' eleganti.


registro dalla chiave incriminata.
Avevo pensato di mettere che quando parte se esiste la controllo, se
non esiste la creo. Quando chiudo, la cancello. E' naturale che se
esiste ma e' fuori timeout c'e' stato qualche problema.
Saluti.


 e non so come trovare
Spy++
Ciao.

Spy++
Agh, non l'ho mai usato e non ci avevo pensato...
Provo ad usarlo allora :)
Saluti.


Non ho capito ma mi fido :) Guardo subitonell'MSDN a queste voci.
Ok, ok. Non avevo ancora aperto Spy++.
Ma il quesito rimane: tutti gli MDIForm hanno quella ClassName? Sono
basito... E come si distinguono? Soltanto per l'handle? E,
soprattutto, perche' la chiamata alla funzione dell'API non ritorna
questa stringa?
Visto che mi sembri esperto in queste cose: c'e' un modo sicuro per
controllare se l'handle a una finestra e' ancora valido?


 un'ottima abitudine dei programmi in C++--?
Le finestre di ogni applicazione VB sono tutte della stessa classe (a
meno che non siano create facendo uso dell'API).
E sono per l'appunto quelle che ho scritto sopra (non le troverai in
MSDN).
Ciao.

 controllare se l'handle a una finestra e' ancora valido?
Public Declare Function IsWindow Lib "user32" Alias "IsWindow" (ByVal
hwnd As Long) As Long
Restituisce zero se l'handle non e' valido.
Ciao.

hwnd As Long) As Long
Ottimo. Utilizzero' quella.
