Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Problemi di fuoco

Ho letto parecchi interventi sul NG riguardanti la possibilità di rendere
attiva un'altra applicazione dalla mia applicazione, e fino a qua è
semplice, usando AppActivate o SetForegroundWindow.
Putroppo però la cosa che sembra più banale, ossia rendere attiva me stessa,
sembra impossibile. O almeno io non ho trovato nessuna soluzione decente.
Per spiegarmi meglio, ecco lo scenario. P1 è il mio programma in VB6, P2 è
un programma di terze parti del quale non ho il controllo, ad esempio
Notepad.
Quando P2 è l'applicazione attiva, anche se da P1 con un timer invoco un
AppActivate Me.Caption o anche un SetForegroundWindow, tutto quello che
ottengo è il lampeggio di P1 sulla taskbar, ma l'applicazione attiva resta
sempre inesorabilmente P2.
Una soluzione che sembra funzionare, ma che è brutta e che vorrei tenere
come ultima spiaggia è quella di richiamamre con una Shell un terzo
programma (P3) che non fa altro che invocare l'AppActivate verso P1 e
chiudersi.
Possibile che non ci siano altre soluzioni senza scomodare un terzo
programma ?
Qualche consiglio ?


mi sfugge qualcosa....
se io sto scrivendo un testo in word....posso anche far partire
access...ma se continuo a scrivere ...rimane sempre word in primo
piano!
Occhio a confondere "attivo" con "in primo piano"....
La tua applicazione probabilmente parte....ma non appare in primo
piano....
ed allora....
perchè non trasformi la tua app in servizio se deve essere invocata da
terzi?
è un bagno di sangue in vb6...ma si può fare....
oppure...perchè la tua app non diventa un server exe che espone un
interfaccia com?
Se l'obiettivo è SOLTANTO avviare la tua app....basta anche soltanto
richiamare l'exe con una shell execute!
Il tuo programma verificherà se è gia attivo e in caso contrario si
avvierà...
il fatto di andare in primo piano o meno è un altro paio di
maniche....non ci andrà mai se il secondo programma monopolizza
l'input!...si parcheggerà in background!
Mi sfugge cosa vuoi fare..nello specifico!!!
Per dire...io in un  programma lancio pdf creator per creare un
pdf....lo uso con la sua interfaccia com...lui lavora in sottofondo e
quando ha fatto mi rende disponibile il file.
L'interfaccia com prevede anche che si eseguano finestre modali
(sincrone)...ma io potrei lanciarlo asincrono e proseguire nel mio
programma.

 piano....
Avrei dovuto rileggere meglio il mio post.
P1 (mia app) e P2 (notepad) sono già in esecuzione, non devo lanciare
niente.
Io vorrei che P1 diventasse attiva ED in primo piano quando lo voglio (timer
nell'esempio), anche quando è P2 ad essere attiva ed in primo piano.
Ovviamente senza cliccare sulla taskbar.


come fai ad avere 2 applicazioni in primo piano???
Il focus l'ha sempre e soltanto una finestra!
se p1 ha il focus...p2 lo perde e viceversa (poi continua a stampare o
elaborare questo è un altro discorso!)
io ora sto scrivendo su google e scaricando la posta...outlook è li in
sottofondo...se clicco su outlook...questa finestra perde il
focus!...e viceversa...
mi perdo qualcosa???
Se vuoi mantenere una app in vb6 in primo piano normalmente userei
http://www.it-lang-vb.net/Archivio/FAQ/FAQ00043.HTM
e una delle tante implementazioni è
http://forum.html.it/forum/showthread/t-754179.html
Certo se p2 però ha un controllo sulla perdita del focus e richiama
anch'essa quella api....non risolvi nulla!Solo un veloce sfarfallio!
Altrimenti non c'è problema...deve funzionare!

 come fai ad avere 2 applicazioni in primo piano???
Non sono ovviamente in primo piano entrambe contemporanemante.
Probabilmente, anzi, sicuramente uso impropriamente i termini "attivo" ed
"in primo piano".
Ricomincio daccapo, cercando di semplificare al massimo le cose.
P1, il mio programma, è una banale form con una TextBox (Text1) ed un Timer
impostato a 5000 ms.
Il codice nell'evento Timer di P1 è il seguente:
Private Sub Timer1_Timer()
   Text1.SetFocus
End Sub
P2 è il mio bel Notepad.
Lancio P1 e P2 e li dispongo appaiati, in modo da poterli vedere entrambi.
Sulla taskbar clicco il task del Notepad, per cui la finestra diventa attiva
ed ha il fuoco. P2 non è attivo, e lo vedo sia dal colore della barra del
titolo, sia dal fatto che su Text1 non vedo il cursore lampeggiante.
Quando scatta l'evento del timer su P1 la barra del titolo di P1 inizia a
lampeggiare (stessa cosa sulla taskbar), compare anche il cursore
lampeggiante su Text1, ma Notepad continua ad essere la finestra attiva (o
l'applicazione in primo piano, non so quale delle espressioni sia più
appropriata): se digito qualcosa, il testo appare su Notepad.
Quello che vorrei fare è che quando il mio timer di P1 scatta, richiami
"qualcosa" che fa diventare attivo P1, in modo che se digito qualcosa, vado
a scrivere su Text1.

Dimenticavo di dire che ho provato, sempre all'interno dell'evento Timer,
anche con AppActivate Me.Caption e con SetForegroundWindow Me.hwnd (che poi
credo siano istruzioni equivalenti): stesso risultato.
Usando invece queste istruzioni da un terzo programma (P3) ovviamente
passando la caption di P1 o l'hwnd di P1, ottengo quello che voglio. Da P1
stesso no.

Prova questo e fammi sapere...
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) 
As Long
Private Sub Timer1_Timer()
    BringWindowToTop hwnd
    Text1.SetFocus
End Sub
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

> Prova questo e fammi sapere...
Niente, stesso risultato: lampeggia la barra del titolo, vedo il cursore su
Text1, ma l'applicaizone attiva è sempre Notepad.

 ha scritto nel messaggio 
news:495b...@extreme.x-privat.org...


 su Text1, ma l'applicaizone attiva è sempre Notepad.
Scusa un attimo, se vedi la barra che lampeggia e il cursore su Text1,
come fai a dire che è il Notepad a essere in primo piano?


 a questo?
Per filo e per segno. Ap parte i vati Top e Left, ovviamente.
Ah, si comporta allo stesso modo sia eseguendolo dall'IDE che da compliato.
P.S: Sono un maschietto :-)

 come fai a dire che è il Notepad a essere in primo piano?
Perchè la barra del titolo evidenziata (blu scuro nel mio Windows)  è quella
di Notepad, e perchè se digito qualcosa il testo appare su Notepad e non su
Text1.

 P.S: Sono un maschietto :-)
Scusa, mi ha ingannato il nick!


 ma da qualcos'altro...
Mi hai fatto venire il dubbio, ed ho fatto la stessa prova su altri 2 PC.
Sul mio desktop con XP e su un altro con Win2000 il problema rimane.
Su un portatile con Vista funziona.
La faccenda è esmpre più nebulosa..

 Su un portatile con Vista funziona.
Da me con XP funziona


 Da me con XP funziona
La prova l'hai fatta con il notepad o altra applicazione ?

Notepad


Per puro caso ho notato che se utilizzo l'istruzione SendKeys in qualsiasi
momento, non importa che carattere o tasto sia o su che controllo venga
eseguito, da quel momento in poi il fuoco torna a P1 anche solo usando
Text1.SetFocus.
Chi mi sa spiegare il perchè ?