Newsgroup: it.comp.lang.visual-basic
Titolo: Portare una finestra in foreground

Ciao a tutti,
sto cercando di avviare un programma (o un documento) con l'API ShellExecute
da un demone VB residente sulla SysTray.
Il programma funziona ma la nuova finestra che si apre mi appare sempre in
background mentre io voglio che appaia in foreground. Ho provato diverse
funzioni trovate in giro ma nessuna risolve il mio problema.
Qualcuno mi puň aiutare??
Grazie
Lore

 Lore
Andrea


SetForegroundWindow necessita come argomento dell'hwnd della nuova finestra
creata. Come ottenerlo dalla ShellExecute?
Lore

 Lore
Andrea

 ha
scritto:

AppActivate
Non č il massimo ma se conosci con precisione il titolo della finestra ( e
soprattutto se č univoco ) puň andare.
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it


heehehhe nient'altro? ;-)
Se conosce il titolo ( che DEVE essere univoco ) della finestra fa prima con
AppActivate.
Ciaoo


 Infine metti tutto assieme e poi vieni a ringraziare :-)
Grazie
Lore

 Inviato via 
http://usenet.libero.it
Purtroppo non conosco il titolo della finestra e oltretutto posso avere
finestre con lo stesso titolo.
Per esempio se lancio degli mdb...
Grazie comunque.
Lore

 ha
scritto:

Scusa eh ma mi č venuto un dubbio ( senza offesa !!!! ), ma hai settato il
parametro "nShowCmd" della ShelleExecute con il giusto valore?


 Lore
Andrea

 ha
scritto:

Ho riprodotto la situazione e dalla systray ho lanciato notepad cosě
 hApp = Shell("c:\windows\notepad.exe", vbShowNormalFocus)
e si č aperto in primo piano, pensa che anche la ShellExecute sia in grado
di fare la stessa cosa ( probabilmente la Shell si appoggia proprio sulls
ShellExecute :P ).
Ciaooo


 Inviato via 
http://usenet.libero.it
SW_SHOWNORMAL
Corretto?
Ciao

 Inviato via 
http://usenet.libero.it
Niente, non mi funziona: ho provato anche con un copia incolla della riga
sopra e non mi viene in primo piano.
Forse il problema nasce dal fatto che quando parte la shell, il programma
lanciante (quello nella systray) non č attivo.
Per spiegarmi meglio: ho creato un piccolo demone che ascolta su una porta
TCP e quando riceve un determinato pacchetto deve aprirmi un documento (il
cui PATH si trova nello stesso pacchetto). E' chiaro che il pacchetto arriva
random e magari in quel momento io sto navigando col mio browser...
Grazie comunque per l'aiuto.
Ciao


E se ha piů istanze della stessa classe...?
Ciaoo


 Ciaoo
Ciao
Andrea

 Ciao
Hai provato questo?
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal
hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As
Long, ByVal cy As Long, ByVal wFlags As Long)
Private Sub StoNelDemon()
     SetWindowPos hWndDellaFinestra, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha
scritto:

Be se tu stai facendo un altra cosa probabilmente č per quello che non viene
in primo piano prova a non fare nulla e guarda se la finestra si porta in
primo piano.
Se si probabilmente devi forzare l'applicazione ( quella che apri ) a stare
sempre in primo piano perň credo che la cosa si complichi un pochino se
l'applicazione che apri non č la tua perchč dovresti modificare gli
attributi della window class di una applicazione non tua perň se la form che
apri č della tua applicazione allora č piu semplice la cosa.
Ti posto il codice cosi fai prima
'*Porta in primo piano
#If WIN32 Then
    Dim lResult as Long
    lResult = SetWindowPos (me.hWnd, HWND_TOPMOST, _
    0, 0, 0, 0, FLAGS)
#Else 'L'API 16-bit usa la Sub e non la Function
    SetWindowPos me.hWnd, HWND_TOPMOST, _
    0, 0, 0, 0, FLAGS
#END If
'*Ripristina la situazione hehehe
#If WIN32 Then
    Dim lResult as Long
    lResult = SetWindowPos (me.hWnd, HWND_NOTOPMOST, _
    0, 0, 0, 0, FLAGS)
#Else 'L'API 16-bit usa la Sub e non la Function
    SetWindowPos me.hWnd, HWND_NOTOPMOST, _
    0, 0, 0, 0, FLAGS
#END If
Ripeto se il form che vuoi portare in primo piano e roba tua ( anche se di
un'altro eseguibile basta che hai il source da adattare ) č una cosa sennň č
un pň piů delicata la faccenda.
Scusa eventuali imprecisioni ma sto andando di corsa eheheh
Ciaoo



Ciaooo


 > lanciante (quello nella systray) non č attivo.

Azz non avevo visto il post quando ho iniziato a scrivere quello piů sotto
hehehehe


 Inviato via 
http://usenet.libero.it
Provato!!! Ho portato la finestra in TOPMOST con l'API che mi avete
consigliato e ho lanciato la shell.
Risultato: la prima finestra viene in foreground (ma non è attiva, titolo
della barra grigio), la seconda rimane dietro.
Lore

 ha
scritto:

Scusa ma non ho capito, NON ha funzionato allora?


 della barra grigio), la seconda rimane dietro.
Dopo aver usato il codice "topmost" hai provato che suvccede se aggiungi
anche unaq chiamata a setforegroundwindow?


 Ciaooo
Andrea

 Scusa ma non ho capito, NON ha funzionato allora?
Un po' di quoting... ? ;-)


Ecco fatto!!! ;-P


Nk e Lore,
Per favore, imparate a quotare oppure sarò costretto al plonk.
Ciao
Andrea


Dato che non sono un'assiduo frequentatore di Newsgroup, potresti definire
"plonk".
Grazie e ciao


 ha
scritto:

Ma tu crei l'exe o provi nell'IDE?
Nel secondo caso ( stando a fonti MS ) dovrebbe aver problemi, prova con
l'exe
Ciao


 Grazie e ciao
Andrea

Plonk.
Andrea

 Inviato via 
http://usenet.libero.it
No, non ha funzionato.
Lore

 ha scritto nel messaggio
news:b353lo$1hqght$1...@ID-170738.news.dfncis.de...

Qual è il modo più corretto per quotare replicando a messaggi molto lunghi?
Ciao
Loren

 ha
scritto:

mmmm molto strano, senti l'unica cosa che posso dirti, a questo punto, è
mandami il source che gli do un'occhiata.
Ciaooo



E cosa avviene dopo?
Ciao


 anche unaq chiamata a setforegroundwindow?
Si' ho provato ma non va.
Ciao
Lore

 Ciao
Ho porovato entrambe le soluzioni e il comportamento è analogo.
Ciao
Lore

 mandami il source che gli do un'occhiata.
Provo un affondo nel week-end e se non ho risultati ti mando il codice.
Grazie
Lore

 wrote in message
news:b3597k$htc$
1...@news2.isdnet.net

Ricapitolo: hai un programma nella tray che per i fatti suoi cerca di
protare una finestra in pimo piano.
La finestra compare - anche come topmost - ma non ha il focus. Questo
perchè nel frattempo hai un'alttra finestra con focus.
Allora forse puoi usare questo trucco: dalla finestra che deve avere il
focus, puoi provare ad impostare una sub richiamabile dal demon nella
tray che mostri una MsgBox SystemModal. E dopo che l'utente ha fatto
click su di essa puoi tentare un semplice Me.SetFocus. Se la và la và...


messaggi molto lunghi?
Innanzitutto cercare di tenersi sotto i 72 caratteri per riga.
Si deve quotare SOLO il testo a cui si risponde.
Ciao
Andrea

 Lore
Andrea

 ha
scritto:

Ok
Ciao


 Ecco fatto!!! ;-P
Sei di una simpatia unica.
Ti sego.


Articolato ma ha un suo senso. Ora non posso più provare, nel week-end mi ci
metto.
Grazie
Lore

 Andrea
Lore

 Qual č il modo piů corretto per quotare replicando a messaggi molto
lunghi?
Da Paperino:
http://www.marco5x.net/usenet/quoting.php


              E la vita tornera' a sorriderti.
.............................................................
      E' una campagna per la salvaguardia dei niubbini
.............................................................
CIAnO

Mettendo in pratica i vostri consigli e
soprattutto combinandoli nei modi più
svariati, ho risolto il problema.
Chiamo prima la funzione:
SetWindowPos hWndForm, HWND_TOPMOST, _
    0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
Per portare la finestra in primo piano
anche se non attiva poi chiamo la funzione
pSetForegroundWindow (vedi sotto) trovata
in rete per dare il fuoco e poi richiamo la
funzione SetWindowPos con NOTOPMOST per fare
in modo che non resti SEMPRE in primo piano
Grazie a tutti
Lore
Public Sub pSetForegroundWindow(ByVal hWnd As Long)
    Dim lForeThreadID As Long
    Dim lThisThreadID As Long
    Dim lReturn       As Long
    '
    ' Make a window, specified by its handle (hwnd)
    ' the foreground window.
    '
    ' If it is already the foreground window, exit.
    '
    If hWnd <> GetForegroundWindow() Then
        '
        ' Get the threads for this window and the foreground window.
        '
        lForeThreadID = GetWindowThreadProcessId(GetForegroundWindow, ByVal
0&)
        lThisThreadID = GetWindowThreadProcessId(hWnd, ByVal 0&)
        '
        ' By sharing input state, threads share their concept of
        ' the active window.
        '
        If lForeThreadID <> lThisThreadID Then
            ' Attach the foreground thread to this window.
            Call AttachThreadInput(lForeThreadID, lThisThreadID, True)
            ' Make this window the foreground window.
            lReturn = SetForegroundWindow(hWnd)
            ' Detach the foreground window's thread from this window.
            Call AttachThreadInput(lForeThreadID, lThisThreadID, False)
        Else
           lReturn = SetForegroundWindow(hWnd)
        End If
        '
        ' Restore this window to its normal size.
        '
        If IsIconic(hWnd) Then
           Call ShowWindow(hWnd, SW_RESTORE)
        Else
           Call ShowWindow(hWnd, SW_SHOW)
        End If
    End If
End Sub

             Call AttachThreadInput(lForeThreadID, lThisThreadID, True)
[...]
Interessante. Non è che posti anche il link alla funzione e/o posti il
codice della "AttachThreadInput"?
Grazie,
Cesare 


 wrote in message
news:b3ch6f$2gso$
1...@news5.isdnet.net
--Cesare: chiedevo lumi sulla funzione AttachThreadInput
Lascia stare, l' ho trovata.
Se qualcuno è interessato, si trova qui:
http://www.trainorcreations.com/misc/files/Minimizer.txt


 Cesare
Posto direttamente il link al sorgente che ho scaricato:
http://www.thescarms.com/vbasic/alttab.asp
Ciao
Lore

 
http://www.thescarms.com/vbasic/alttab.asp
Grazie!
