Condividi:        

Form in primo piano API SETWINDOWPOS

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 21/11/15 18:47

scossa ha scritto:
simo73 ha scritto:Si ho visto che ci va molto vicino a quello che vorrei, ma se fossi a lavorare in world , il form resterebbe comunque sotto o sbaglio?


No, se togli le varie Application.visible ... , anche con Word in primo piano, dopo 30 secondi Excel passa in primo piano.


Intendevi dire dopo 30 secondi il form passa in primo piano .......
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Sponsor
 

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 20:01

Forse ho capito perché a te non funziona: riduci excel ad icona dopo aver cliccato il pulsante che apre la userform, vero?

Aggiungi Application.WindowState = xlMaximized come prima istruzione alla sub PRIMO():

Codice: Seleziona tutto
Sub PRIMO()
  Application.WindowState = xlMaximized
  SetWindowPos Application.hwnd, HWND_TOPMOST, 0, 0, _
      0, 0, SWP_NOMOVE + SWP_NOSIZE
  SetWindowPos Application.hwnd, HWND_NOTOPMOST, 0, 0, _
      0, 0, SWP_NOMOVE + SWP_NOSIZE
End Sub
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Form in primo piano API SETWINDOWPOS

Postdi Anthony47 » 21/11/15 21:30

Ciao scossa.
Io ho interpretato quello che dice simo nel seguente modo:
-lui ha un foglio Excel che gira autonomamente; supponiamo che ogni minuto riceva dei dati da un sito esterno mettiamo di dati finanziari; quando un valore letto supera una soglia il file Excel spara fuori una userform di notifica.
Ma lui nel frattempo sta facendo altre cose.
Ebbene vorrebbe che quando la userform si manifesta lui la possa vedere; da qui la richiesta di vederla in foreground.

Quindi il modo per simulare la cosa e':
-il pulsante schedula l'esecuzione della macro dopo N secondi
-in questi N secondi tu attivi un'altra applicazione
-dopo N secondi la macro attiva la userform; contemporaneamente dovrebbe partire tutto il codice che serve per portare il messaggio in primo piano.

Modificato in questo modo il tuo codice a me ha funzionato; il problema (problema?) e' che a me all'inizio aveva funzionato anche il codice (quello che avevo suggerito io) basato sulla SetForegroundWindow; salvo non funzionare dopo il riavvio di Excel... A quel punto mi sono ricordato che gia' avevo avuto il problema in altra situazione, che avevo risolto con una funzione "ForceForegroundWindow" basata su SetForegroundWindow trovata sul sito answers.microsoft.com; detto per inciso la stessa ForceForegroundWindow non centra l'obiettivo di Simo.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19213
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 21:51

Ciao,

Anthony47 ha scritto:Io ho interpretato quello che dice simo nel seguente modo:


Probabilmente è così, io mi sono limitato a "leggere" quello che ha chiesto:
"Purtroppo lancio la macro a tempo, mi sposto in un altra applicazione e il form che si attiva rimane comunque in secondo piano cioè nel foglio excel, infatti se mi sposto in excel il form1 è presente. Qualcuno sa spiegarmi dove sbaglio. Grazie in anticipo."
Il codice che ho proposto, con l'aggiunta dell'istruzione Application.WindowState = xlMaximized si comporta come richiesto: porta in primo piano excel allo scadere dell'intervallo impostato con il metodo OnTime, indipendentemente dall'applicazione attiva (browser, Word ....).

Quindi, come adattare il codice al suo file reale è un aspetto che esula dal problema "come portare excel in primo piano" (che mi sembra risolto - mi confermi che funziona anche a te?) e se simo non vuole fornire un file coerente con quello reale (quindi con tanto di userform, pulsanti e quant'altro) io di certo non mi metto a "inventarmelo" ....
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 22/11/15 00:11

Antony hai centrato il problema. Acquisisco dati da un DDE esterno che ho sistemato grazie hai tu suggerimenti passati, adesso in base ad una condizione devo attivare un form che devo vedere apparire in primo piano perché mi trovo a lavorare durante il giorno su altre applicazioni.
Scusami scossa non è che non voglio pubblicare il codice e che per simulare quello che mi serve basta come hai fatto tu un pulsante che attivi una marco che a sua volta attiva un form in primo piano. Dopo non farò altro che sostituire al posto del pulsante la mia condizione. Il timer l'avevo messo solo per ritardare l'apertura del form che mi consentiva di spostarmi su un'altra applicazione tipo word e verificare se il form effettivamente appariva in primo piano, poi chiaramente questa temporizzazione la tolgo.
Comunque Scossa hai ragione io riduco ad icona Excel, proverò anche questa nuova modifica che mi hai suggerito.
Antony siccome hai capito perfettamente il problema e hai già testato il codice verificando che funziona, se non riesco a farlo girare potresti farmi la cortesia di pubblicarlo per intero. Grazie per la pazienza e domani vi farò sapere.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 22/11/15 16:12

Ho modificato leggermente il codice (non la sostanza) per adattarlo alle mie esigenze. Per cortesia provate questo codice caricato su un modulo standard con il solito pulsante di attivazione:
Codice: Seleziona tutto
Private Const HWND_TOPMOST As Long = -1
Private Const HWND_NOTOPMOST As Long = -2
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOSIZE  As Long = &H1
Public inizio As Date
'Public partenza As String


Sub lancioform()
  UserForm1.Show vbModeless
  Call PRIMO
 
End Sub

Sub PRIMO()
  Application.WindowState = xlMaximized
  SetWindowPos Application.hwnd, HWND_TOPMOST, 0, 0, _
      0, 0, SWP_NOMOVE + SWP_NOSIZE
  SetWindowPos Application.hwnd, HWND_NOTOPMOST, 0, 0, _
      0, 0, SWP_NOMOVE + SWP_NOSIZE
End Sub


Sub Pulsante1_Click()
inizio = Range("F7")
Application.OnTime TimeValue(inizio), "lancioform"
End Sub



Imposto in F7 un'ora che mi consente di spostarmi sul desktop o su un altra applicazione.
Prima prova.
Imposto l'ora in F7, Click sul pulsante1, mi sposto ad esempio sul desktop, appena parte la sub lancioform, il form ed excel appaiono in primo piano insieme ad excel (molto bene!!!).
Seconda prova.
Imposto l'ora in F7, lancio di nuovo la routine, apro ad esempio word e lo lascio in primo piano, nel momento in cui parte la routine il form non appare ma resta 'intrappolato' nella barra delle applicazioni, infatti inizia a lampeggiare l'icona di excel senza che si apra il programma come invece succedeva nel precedente caso. Idem anche con tutte le altre applicazioni che decido di mettere in primo piano sul desktop.
In conclusione se mi trovo sul desktop tutto va a meraviglia se sto lavorando su un'altra applicazione il form non sale in primo piano. Spero di essere stato abbastanza chiaro.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 22/11/15 16:48

Perché hai spostato UserForm1.Show vbModeless all'interno di lancioform() anziché lasciarla in Pulsante1_Click() ??
Secondo me la userform deve essere già visibile quando ti sposti in altre applicazioni; infatti spostandola in Pulsante1_Click() funziona correttamente ed Excel viene portato in primo piano anche se ero in Word.

Comunque se fossi in te prenderei in considerazione l'acquisto di un secondo monitor sul quale visualizzare costantemente Excel, ti semplifica la vita ed hai la situazione sempre sotto controllo.
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Form in primo piano API SETWINDOWPOS

Postdi Anthony47 » 23/11/15 03:02

Ciao scossa,
il motivo per cui simo mette la userform all'interno della macro che si attiva N secondi dopo e' che questa e' la condizione in cui lui si trovera': Excel in background, che saltuariamente vorra' inviare segnalazioni all'utente, che nel frattempo lavora presumibilmente in altri ambienti. Ma credo che questa sia una invariante, rispetto alle prestazioni richieste.

Ho modificato il tuo file per attivare quindi la userform 5 secondi dopo aver premuto il pulsante, per consentire all'utente di simulare il passaggio ad altra applicazione lasciando Excel in background.
Ho inoltre aggiunto un secondo foglio con un secondo metodo, basato su WScript.Popup.

Su questo file ho fatto le seguenti prove con i seguenti risultati

A) Prove con Pulsante2 (in Foglio1; metodo "scossa")
1) Modalita' di prova: premo Pulsante2, dalla barra delle applicazioni seleziono Firefox (che e' gia' aperto) e attendo 10 secondi
-dopo 5 secondi Excel e la sua form compaiono in primo piano, ma le applicazioni non sono attive (non ricevono l'input da tastiera)
-ripetuto piu' volte, stesso comportamento
Stesso comportamento se, dopo aver premuto il pulsante, si attivano Word, I.E., Thunderbird

2) Modalita' di prova: premo il pulsante2, minimizzo Excel, seleziono Firefox
-dopo 5 secondi la sola form compare in primo piano, e Firefox rimane attivo (es hyperlink visualizzati al passaggio del mouse)
-se click su hyperlink la form rimane in primo piano mentre firefox visualizza le nuove pagine; se digito da tastiera l'input va in eventuali caselle di testo aperte (es quella di google.it) o nella casella di ricerca rapida di firefox
-ripetuto piu' volte, stesso comportamento
Se invece di Firefox si seleziona si seleziona Thunderbird o IE il comportamento e' lo stesso
Se invece di Firefox si seleziona Word, la form arriva in primo piano ma Word perde il focus (non riceve piu' da tastiera o mouse)

B) Prove con Pulsante WS (in Foglio2)
1) Modalita A1 come sopra
-dopo 5 secondi compaiono in primo piano due popup coi messaggi programmati; il secondo copre parzialmente il primo
-il focus rimane su Firefox, ma con la navigazione i popup passano in background e la loro presenza rimane visibile nella barra delle applicazioni
-i popup scompaiono dopo 5 e 10 secondi di vita, come programmato.
Se invece di Firefox si seleziona si seleziona Thunderbird o IE il comportamento e' lo stesso
Se invece di Firefox si seleziona Word, i popup arrivano in primo piano (e scompaiono dopo i secondi di vita programmati), ma il focus rimane sull'applicazione, per cui se si sta scrivendo al primo carattere i messaggi scompaiono e passano in secondo piano.

2) Modalita' A2 come sopra
-il comportamento e' come la Modalita' B1

Provato con Win7 e Office 2010

Riepilogo personale:
La macro di scossa porta efficacemente e mantiene in primo piano la userform, con Excel sottostante (metodo 1) oppure con l'applicazione "corrente" sottostante (metodo 2, cioe' avendo minimizzato Excel)
Lo script ha un risultato piu' debole (vedasi possibilita' che l'applicazione corrente ritorni rapidamente in primo piano), ma i messaggi scompaiono autonomamente dopo N secondi (programmabile; la macro invece prosegue autonomamente)

Il file di prova l'ho caricato su dropbox: https://www.dropbox.com/s/1t16xcuxe4zr6 ... .xlsm?dl=0

Sarebbe utile che simo faccia le prove su questo stesso file, con la stessa metodologia.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19213
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 23/11/15 11:22

Grazie Anthony, questa sera proverò il file senza modificarlo e appena posso vi farò sapere.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 23/11/15 15:40

Nella pausa pranzo ho eseguito numerose prove con il file originale ottenendo diverse risposte che pubblico di seguito sperando che vi siano di aiuto. Ho utilizzato come browser google chrome.
PROGRAMMA SCOSSA
1. Ho lanciato 'scossa', non ho minimizzato excel, mi sono spostato su google, il form resta intrappolato in excel.
Tutte le volte che non minimizzo excel il form non appare mai in primo piano, quindi sono passato a testare le varie soluzioni minimizzando excel con i seguenti risultati.
2. Ho lanciato 'scossa', ho minimizzato excel, mi sono spostato su google, il form appare in primo piano.
3. Ho lanciato 'scossa', ho minimizzato excel, mi sono spostato su google, ho cambiato scheda, il form non appare in primo piano.
4. Ho lanciato 'scossa', ho minimizzato excel, mi sono spostato su word, il form appare in primo piano.
5. Ho lanciato 'scossa', ho minimizzato excel, mi sono spostato su word,ho scritto una riga, il form non appare in primo piano.
6. Ho lanciato 'scossa', ho minimizzato excel, mi sono spostato su autocad, il form appare in primo piano.
7. Ho lanciato 'scossa', ho minimizzato excel, mi sono spostato su autocad,ho disegnato una linea, il form non appare in primo piano.
In conclusione nel momento in cui avvio la routine sembra che excel legga la situazione che trovo negli altri applicativi e se cambio qualcosa, una scheda nel browser, una parola in word, una linea in autocad ecc. non riconosca più quella situazione e il form appare intrappolato in excel.
SCHEDULA
La stessa identica cosa succede con la seconda routine schedula, con la differenza che le msg appaiono sempre in primo piano. Il problema e che scaricando da un DDE dati ogni 2 sec, la msg mi bloccha la routine fino a quando non la chiudo. Se non fosse per questo sarebbe perfetta.
Spero di essere stato chiaro.
Ultima modifica di simo73 su 23/11/15 15:53, modificato 1 volte in totale.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi Anthony47 » 23/11/15 15:45

Ma tu con quale OS lavori? E, per evitare equivoci, hai lavorato col file che ho pubblicato senza apportare modifiche, vero?
Il messaggio che appare lavorando su Foglio2 non e' prodotto da Msgbox: la macro chiede a Shell di aprire il messaggio e continua, senza aspettare che il messaggio si chiuda per timeout o per pulsante ok. Infatti vedi ambedue i messaggi, lanciati dalla macro in sequenza.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19213
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 23/11/15 16:34

Lavoro con Windows 10. Come avevo precisato in premessa non ho modificato il programma.
Comunque scusa la mia ignoranza in materia, il messaggio che appare effettivamente non è una msgbox. Come ti avevo anticipato questi messaggi arrivano in primo piano in qualsiasi condizione ed è perfetto, peccato per la userform1.
Potrei quindi utilizzare questa soluzione.
E' possibile portare all'interno del messaggio il valore di una cella? Grazie di nuovo
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 23/11/15 19:22

Antony ci sono riuscito basta legare la scritta dell' Msg con &RANGE("cella") .
Invece è possibile scrivere su due o più righe, cosi potrei riportare tutte le informazioni che avevo nel userform.
Grazie
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi Anthony47 » 24/11/15 00:06

Il codice usato per far comparire i messaggi e' il seguente:
Codice: Seleziona tutto
Msg = "Allarme generale..."
aaa = Shell("mshta.exe vbscript:close(CreateObject(""WScript.Shell"").Popup(""" & Msg & """,5,""Informazione"",64))")
Msg = "Allarme generale 22..."
aaa = Shell("mshta.exe vbscript:close(CreateObject(""WScript.Shell"").Popup(""" & Msg & """,5,""Informazione"",64))")

Avevo separato la compilazione del messaggio proprio perche' immaginavo che esso doveva essere compilato volta per volta.
Per avere un messaggio multiriga, teoricamente:
Codice: Seleziona tutto
msg ="Messaggio riga 1" & vbCrLf & "Messaggio riga 2"

Tuttavia nelle istruzioni adottate la riga non viene spezzata dal vbCrLf; poiche' questo metodo e' l'unico che consente al popup di venire in primo piano e non bloccare la continuazione delle macro io posso solo concludere che la multilinea non e' gestibile (in attesa di contributi ulteriori).

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19213
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 24/11/15 23:08

Anch'io ho provato questo tipo di istruzione ed anche altre che normalmente funzionano con la msgbox ma senza avere riscontri positivi.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "Form in primo piano API SETWINDOWPOS":


Chi c’è in linea

Visitano il forum: Nessuno e 29 ospiti