+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: riposizionare form in primo piano

  1. #1
    stefano_ non è in linea Scolaretto
    Luogo
    Italy
    Post
    312

    riposizionare form in primo piano

    salve a tutti,
    premesso che sono un autodidatta ..... normalmente crea applicazioni singolo form con la proprieta top most impostata a true ,
    questa volta invece ho un problemino, mi spiego:
    la mia applicazione viene lanciata da un icona posta su un altro programma, quindi clicco sull'icona e parte il mio programmino, questa volta la proprieta top most deve essere false perche se clicco nella finestra del programma principale il mio form deve passare in secondo piano.
    A questo punto ( con il mio form in secondo piano ) capita che mi dimentichi che il mio programma è in esecuzione quindi clicco nuovamente sull'icona nel programma principale per avviare la mia applicazione. A questo punto mi appare il messaggio che il mio programma è già in esecuzione e visto che è ià in esecuzione vorrei " solamente " riportarlo in primo piano. Magari ho altre tre applicazioni aperte ma vorrei portare in primo piano il mio form ma non ci riesco !
    ho provato
    me.activate
    me.windowstate = vbnormal
    Me.BringToFront()
    Me.Show()

    le ho provate di tutte !!!
    grazie.

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,904
    Blogs
    5
    Ma il codice che mostri sta nel primo o nel secondo programma? Ovvero in quello dell'icona che usi per avviarlo o nel programma avviato?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    stefano_ non è in linea Scolaretto
    Luogo
    Italy
    Post
    312
    Ciao e grazie,
    Scusa ma capisco di essermi spiegato male, il codice è scritto nel programma avviato.
    In pratica diciamo che lavoro con Autocad ed uso VB net per crearmi delle macro, quindi in auto ad mi creo un pulsante che lancio l'eseguibile fatta da me all'interno del programma da ma fatto in VB net ho messo il controllo cge se nel momento in cui lo lancio è già in esecuzione mi avverte con un msg box e mi dovrebbe portare il forum dell'applicazione da me fatta in primo piano.
    Grazie

  4. #4
    ljt
    ljt non è in linea Scolaretto
    Post
    227
    Quote Originariamente inviato da stefano_ Visualizza il messaggio
    Ciao e grazie,
    Scusa ma capisco di essermi spiegato male, il codice è scritto nel programma avviato.
    In pratica diciamo che lavoro con Autocad ed uso VB net per crearmi delle macro, quindi in auto ad mi creo un pulsante che lancio l'eseguibile fatta da me all'interno del programma da ma fatto in VB net ho messo il controllo cge se nel momento in cui lo lancio è già in esecuzione mi avverte con un msg box e mi dovrebbe portare il forum dell'applicazione da me fatta in primo piano.
    Grazie
    Spero di avere capito bene.
    Per verificare se l'applicazione è già in esecuzione uso il seguente codice:
    codice:
     Public Sub CtrOpenPrg()
            If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length > 1 Then
                MsgBox("Il programma è già in esecuzione.", MsgBoxStyle.Critical + vbOKOnly, "MioProgramma")
                Application.Exit()
            End If
        End Sub
    Ovviamente deve essere riadattato al tuo caso.

    Ciao

  5. #5
    stefano_ non è in linea Scolaretto
    Luogo
    Italy
    Post
    312
    grazie dell'informazione ma il problema non è questo , scusate se mi sono spiegato male....
    in pratica il programma è avviato ma non me ne accorgo perche il form è in secondo piano ( non posso mettere a true la proprietà top most, mi è utili che mi vada in secondo piano ! ) quindi lo avvio nuovamente, a questo puntoi ho inserito nel form load il tuo codice ( simile ) ma alla fine NON voglio che venga terminata l'applicazione ma voglio che il form dell'applicazione (che è avviata ma è in secondo piano e quindi non la vedo) venga riportato in primo piano.
    Spero di essermi spiegato meglio
    grazie.

  6. #6
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    433
    Io dichiarerei una variabile private di tipo Process a livello di form e poi creerei una Sub che, o lancia una nuova istanza del programma se la variabile è Nothing, o porta in primo piano quella già esistente.
    codice:
    'Dichiaro la funzione API per richiamare in primo piano la finestra interessata
    Public Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer
    
    'Dichiaro il riferimento al processo
    Dim processo As Process
    
    Private Sub ApriProgramma()
        If processo Is Nothing Then
            processo = New Process()
            processo.Start(nomeProcesso)
        Else
            Dim x as IntPtr = processo.MainWindowHandle
            Dim y as Integer = SetForegroundWindow(x);
            If y = 0 Then MessageBox.Show("Impossibile portare in primo piano la finestra")
        End If
    End Sub
    L'ho usato in C# senza problemi, ma sono andato a braccio con la conversione in VB... Potrebbero esserci delle sviste.
    Ultima modifica di Sgrubak; 19-10-2020 17:03  Motivo: Corretta svista in parametro SetForegroundWindow

  7. #7
    stefano_ non è in linea Scolaretto
    Luogo
    Italy
    Post
    312
    grazie,
    ho copiato il tuo codice all'interno del mio ....

    Dim P() As Process = Process.GetProcessesByName("GestioneFileCNC_Rev1")
    Dim processo As Process
    For Each pp As Process In P
    If P.Count > 1 Then
    MsgBox("Programma gia in esecuzione !!!!", vbOKOnly, "Attenzione")


    Dim x As IntPtr = processo.MainWindowHandle ' durante il debug qui da errorerocesso.ecceccecc ha generato un eccezione di tipo system.nullreferenceException
    Dim y As Integer = SetForegroundWindow(x)
    If y = 0 Then MessageBox.Show("Impossibile portare in primo piano la finestra")

    End
    End If
    Next

    ma mi restituisce il seguente errore: "riferimento a un oggetto non impostato su un'istanza di oggetto

    Grazie e perdona ancora la mia ignoranza !!

  8. #8
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    433
    Oddio... Ci son parecchie cose che non funzionano in quanto hai postato. Non copiare ed incollare a casaccio...

    Sostituisci TUTTO il codice che hai postato, con il mio.

    Nel caso specifico: l'eccezione che ritorna (NullReferenceException), la evitavi mantenendo il mio If. Ovviamente nel tuo codice [processo] è Nothing... La dichiari ma non la istanzi perché hai tolto
    codice:
    processo = new Process()
    Anche quel ciclo non ha alcun senso di esistere a mio avviso. Riguarda bene quel che hai scritto e cerca di capire perché è sbagliato (Anche se comunque l'array non lo trovo funzionale, ne in questo caso specifico ne, meno che mai, per l'utilizzo che ne hai fatto...)

  9. #9
    stefano_ non è in linea Scolaretto
    Luogo
    Italy
    Post
    312
    ho provato ciao,
    ho provato cosi


    Private Sub frmPrincipale_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim processo As Process
    If processo Is Nothing Then
    processo = New Process()
    processo.Start(Application.StartupPath & "\GestioneFileCNC_Rev1.exe") ' ERRORE
    Else
    Dim x As IntPtr = processo.MainWindowHandle
    Dim y As Integer = SetForegroundWindow(x)
    If y = 0 Then MessageBox.Show("Impossibile portare in primo piano la finestra")
    End
    End If
    End Sub

    l'errore questa volta è che inizia ad aprirmi una finestra dietro l'altra all'infinito ! Sbaglio a mettere questo codice nell'evento form load ?
    Scusami ancora.

  10. #10
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    433
    Ok... Andiamo per gradi:

    1) Il tag CODE è richiesto. Rende tutto più comprensibile.
    2) Studia l'ambito di visibilità di una variabile. Comincia dal link, ma un buon libro è un ottimo investimento.
    2.1) Dopo quanto sopra, è chiaro che la dichiarazione della variabile [processo] è nel posto sbagliato. Spostala affinché sia visibile a tutta la classe che eredita da Form.
    3) Usa il debug. Piazza un bel punto di interruzione dove ti da l'errore e poi di santa pazienza pigia F10. Cerca di capire quale "strada" prende l'esecuzione del codice. Il fatto che apra finestre una dietro l'altra non mi fa pensare ad un errore in questo stralcio specifico di codice, dato che l'evento Load viene richiamato solamente una volta a quanto ne so (ma sono autodidatta pure io, quindi è facile che mi sfugga qualcosa). Propenderei più per qualche riga di codice da qualche altra parte che ti crea l'errore. Farei bene attenzione ad eventuali loop che hai utilizzato (tipo negli esempi precedenti).
    4) Ancora sull'evento Load: non volevi che la tua applicazione partisse al click di un'icona su di un altro programma? Perché lanciarlo già al Load? Do per scontato che questo Load faccia riferimento al programma "che avvia" e non a quello "da avviare", come da tuo post #3.

    Bonus) Attento che l'istruzione End in terzultima riga causa la chiusura dell'applicativo. Dubito sia quello il tuo intento. L'unica fortuna è che attualmente non ci finirai mai, dato che ad ogni Load [processo] è sempre Nothing.

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi