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

Form in primo piano API SETWINDOWPOS

Postdi simo73 » 18/11/15 19:05

Salve a tutti, ho ripreso e modificato un vecchio topic che spiegava come attraverso un API è possibile portare in primo piano un form che resti sempre visibile anche se mi trovo a lavorare in un altra applicazione.
Ho caricato il seguente codice nel form1 dove la prima riga è stata modificata per un sistema a 64bit.

Codice: Seleziona tutto
Private Declare PtrSafe Function SetWindowPos Lib "advapi32.dll" (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) As Long
Private Const HWND_TOP As Long = 0
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


Sub form_active()

SetWindowPos form1.HWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE


End Sub



Mentre in un modulo ho caricato il seguente codice che mi serve solo ad attivare il form1 in un secondo momento. Così ho il tempo di spostarmi in un altra applicazione e verificare se tutto funziona.
Codice: Seleziona tutto
Sub Pulsante1_Click()

Dim INIZIO As Date
INIZIO = Range("M3")

Application.OnTime TimeValue(INIZIO), "PRIMO"



End Sub

Sub PRIMO()
form1.Show vbModeless
End Sub


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.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Sponsor
 

Re: Form in primo piano API SETWINDOWPOS

Postdi Anthony47 » 18/11/15 23:06

Ma tu sei sicuro che un utente che stia, ad esempio, scrivendo una mail o una cosa piu' impegnativa apprezzera' quando si trovera' la tua form in primo piano e la sua applicazione in secondo piano?
Comunque penso che questa riga debba essere posizionata all'interno della UserForm_Activate:
Codice: Seleziona tutto
SetWindowPos form1.HWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE

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

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 19/11/15 20:09

Premetto che quello che sto cercando di fare mi serve proprio per avere un avviso quando mi trovo a lavorare in un altra applicazione, purtroppo anche in seguito alla modifica che mi è stata suggerita il form non ne vuole sapere di uscire in primo piano.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi Anthony47 » 19/11/15 23:08

Mi sono limitato a dare un posto logico al tuo codice...
Non conosco il metodo che hai usato; in genere quando voglio forzare qualcosa in primo piano io uso la funzione SetForegroundWindow:
1) in un modulo standard definisco le librerie che servono, e cioe'
Codice: Seleziona tutto
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetForegroundWindow Lib "user32" _
    (ByVal hwnd As Long) As Long
NB: Vanno rigorosamente in testa la modulo, prima di qualsiasi Sub o Function
NB2: Queste definizioni sono per Office32 bit, se hai Office64 bit devi adattare usando ptrsafe; vedi https://msdn.microsoft.com/en-us/librar ... 14%29.aspx

2) do' una intestazione unica alla mia userform, esempio myUserForm (corrisponde alla proprieta' Caption della Userform)
3) poi nel codice di UserForm_Activate inserisco
Codice: Seleziona tutto
ufHwnd = FindWindow(vbNullString, "myUserForm")
SetForegroundWindow ufHwnd

Prova anche tu con questo metodo...

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

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 20/11/15 00:09

Perfetto proverò questo codice. Se volessi legarlo ad una condizione come posso fare, perché UserForm_Active non lo posso richiamare come una semplice sub. Grazie di nuovo per la pazienza!!!!
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 20/11/15 18:47

Ho provato ma niente da fare, riporto il codice che mi hai suggerito di usare.
Codice: Seleziona tutto
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
___________________________________________________________________________________________________
Public Sub userfrom_Active()
    ufHwnd = FindWindow(vbNullString, "SEGNALI")
    SetForegroundWindow ufHwnd
End Sub
____________________________________________________________________________________________________

Public Sub Pulsante1_Click()

Dim INIZIO As Date
INIZIO = Range("M3")

Application.OnTime TimeValue(INIZIO), "PRIMO"

End Sub
______________________________________________________________________________________________________
Public Sub PRIMO()

SEGNALI.Show vbModeless

End Sub


Ho inserito il codice all'interno di un modulo standard. Non mi segnala alcun errore ma il form non appare in primo piano.
Come puoi notare ho inserito un orario per potermi spostare su un altra applicazione (tipo word) e verificare quindi se funziona.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 20/11/15 22:40

simo73 ha scritto:Ho provato ma niente da fare,


Nel codice che hai proposto nel post iniziale ci sono alcune cose che non quadrano (ad esempio form1.HWND: una userform non ha la proprietà .HWND, che invece appartiene ad Application).

Comunque prendendo spunto da quel codice ho rielaborato il seguente codice che funziona (non avendo il tuo file ho messo un pulsante su un foglio (per far partire l'evento ontime) ed una userform vuota "tanto per ...") :

Codice: Seleziona tutto
'in un modulo standard
Public Declare Function SetWindowPos Lib "user32.dll" (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) As Long
Private Const HWND_TOP As Long = 0
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 String

Sub Pulsante1_Click() 'macro abbinata ad un pulsante sul foglio
inizio = Format(Now + 0.0003, "hh:mm:ss")
UserForm1.Show vbModeless
Application.OnTime TimeValue(inizio), "PRIMO"

End Sub

Sub PRIMO()
 SetWindowPos Application.hwnd, HWND_TOPMOST, 0, 0, _
      0, 0, SWP_NOMOVE + SWP_NOSIZE

'per permettere di riportare in secondo piano excel:
  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 simo73 » 21/11/15 09:05

Ho provato il codice che gentilmente mi hai suggerito, purtroppo si presente il seguente Errore.
Appena lanciata la macro appare l'Userform1 e dopo 3 secondi appare il seguente messaggio:

Errore di run-time'453':
Impossibile trovare il punto di ingresso SetWindowPos della DLL in advapi32.dll
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 09:43

simo73 ha scritto:Ho provato il codice che gentilmente mi hai suggerito, purtroppo si presente il seguente Errore.
Appena lanciata la macro appare l'Userform1 e dopo 3 secondi appare il seguente messaggio:

Errore di run-time'453':
Impossibile trovare il punto di ingresso SetWindowPos della DLL in advapi32.dll


Ti sei ricordato di modificare la dichiarazione con PrtSafe?

Comunque puoi scaricare il file di prova, testato e funzionante in Excel 2010, sia su Windows7 che XP:

https://drive.google.com/open?id=0Bz5X4cISct_7Vk5iOUd6S0JWdms
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 10:34

@Simo, Vedi il messaggio di scossa, sopra.
Sono curioso di sapere se "prima" l'errore riportato usando la soluzione di scossa non si verificava.
Come pure sarebbe utile sapere quale versione di Sistema Operativo e di Office usi.

Quanto al codice che ti avevo proposto io, le istruzioni con SetForegroundWindow andavano messe "nel codice di UserForm_Activate", non in una Sub userfrom_Active che non ha nulla a che vedere con l'attivazione della userform.
Comunque sospendiamo quel metodo, perche' tra l'altro il comportamento all'interno di Win7 (immagino che usi questo SO; confermi) non e' sempre corretto; segui invece quanto suggerito da scossa.

Scossa, sembra che il file che hai linkato non sia di libero accesso; GoogleDrive segnala
È necessaria l'autorizzazione
Vuoi accedervi? Chiedi al proprietario di concederti l'accesso o passa a un account che disponga dell'autorizzazione


Ciao a tutti.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 11:41

Anthony47 ha scritto:Scossa, sembra che il file che hai linkato non sia di libero accesso; GoogleDrive segnala
È necessaria l'autorizzazione
Vuoi accedervi? Chiedi al proprietario di concederti l'accesso o passa a un account che disponga dell'autorizzazione



Opps, ho dimenticato di renderlo pubblico. Ecco il nuovo link, fate sapere se funziona, grazie:
https://drive.google.com/file/d/0Bz5X4cISct_7Vk5iOUd6S0JWdms/view?usp=sharing
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 » 21/11/15 12:07

Premetto che utilizzo w10 e office 2013, ho scaricato e lanciato il programma il quale non segnala nessun tipo di errore però purtroppo non fa quello di cui avrei bisogno. Infatti il form appare subito appena lancio la macro e resta in primo piano in excel mentre cercavo qualcosa che lo portasse in primo piano sul desktop, quando ad esempio mi trovo in word o in un'altra applicazione. Infatti volevo ritardare l'attivazione del form perché avessi la possibilità di spostarmi in un altro applicativo per vedere successivamente se il form stesso appariva in primo piano sullo schermo. Forse mi sono spiegato male oppure non funziona. Comunque di nuovo grazie e se avete altri suggerimenti io sono pronto a testare.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 12:24

simo73 ha scritto:Premetto che utilizzo w10 e office 2013, ho scaricato e lanciato il programma il quale non segnala nessun tipo di errore però purtroppo non fa quello di cui avrei bisogno.


Difficile capire quello che ti serve senza vedere il tuo file Excel.
Comunque, se ho capito bene vuoi nascondere Excel lasciando solo la userform. Prova a sostituire, nel mio file di esempio, tutto il codice con questo:

Codice: Seleziona tutto
Public Declare PtrSafe Function SetWindowPos Lib "user32.dll" (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) As Long
Private Const HWND_TOP As Long = 0
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 String

Sub Pulsante1_Click()
  inizio = Format(Now + 0.0003, "hh:mm:ss")
  UserForm1.Show vbModeless
  Application.Visible = False
  Application.OnTime TimeValue(inizio), "PRIMO"
End Sub

Sub PRIMO()
  Application.Visible = True
  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
  Application.Visible = False
End Sub


Nel modulo di classe della userform scrivi questo codice, in modo che excel torni visibile quando la chiudi, altrimenti resterà nascosto sempre:

Codice: Seleziona tutto
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Application.Visible = True
End Sub



Questo il link al file modificato:

https://drive.google.com/file/d/0Bz5X4cISct_7RERoTEMzaXE2NDQ/view?usp=sharing
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 » 21/11/15 15:05

Provo a spiegarmi meglio. Io lancio il mio programma vba in excel, mi sposto per motivi lavorativi su altre applicazioni, autocad, word ecc.. , si verifica una condizione voglio che il form appaia sul desktop senza che resti all'interno di excel. A quel punto vado in excel, prendo dei dati dal form lo chiudo e il programma nel frattempo continua a lavorare (per quello che uso la condizione vbModeless per non farmare le routine), torno nelle mi applicazioni e aspetto un altro segnale e così via. Spero di essere stato chiaro. Comunque adesso provo il codice che mi hai inviato.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 21/11/15 16:02

Quando dico che il form appaia nel desktop intendo dire che se mi trovo in word mi deve comparire in primo piano, se sono in internet idem e così via.
Nel frattempo ho provato il codice, non ho la necessità che Excel scompaia tanto mi trovo in un altra applicazione voglio solo che il form appaia in primo piano. Se ci riuscite siete dei geni in internet purtroppo non ho trovato niente.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 16:11

simo73 ha scritto:Nel frattempo ho provato il codice, non ho la necessità che Excel scompaia tanto mi trovo in un altra applicazione voglio solo che il form appaia in primo piano. Se ci riuscite siete dei geni in internet purtroppo non ho trovato niente.


E allora togli le istruzioni Application.visible ..... dal codice. Il mio file di esempio fa esattamente quello che hai chiesto: apro il file clicco sul pulsante, passo a Google Chrome (a tutto schermo) e dopo 30 secondi Excel torna in primo piano!
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 » 21/11/15 16:55

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?
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi simo73 » 21/11/15 17:18

Si ci siamo quasi, l'unico problema e che mi resta solo sopra il desktop ma sotto le eventuali applicazioni che in quel momento ho aperto, ad esempio word, acrobat.
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Re: Form in primo piano API SETWINDOWPOS

Postdi scossa » 21/11/15 17:26

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.
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 » 21/11/15 18:12

Devo togliere anche quella presente nel codice del form? Appena ho un minuto provo e ti faccio sapere, intanto grazie
simo73
Utente Junior
 
Post: 38
Iscritto il: 19/05/15 10:01

Prossimo

Torna a Applicazioni Office Windows


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


Chi c’è in linea

Visitano il forum: Nessuno e 82 ospiti

cron