+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Riposizionare form in primo piano

  1. #1
    stefano_ non  in linea Scolaretto
    Post
    314
    Like Inviati  
    0
    Like Ricevuti  
    0
    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
    Post
    17,396
    Blogs
    5
    Like Inviati  
    5
    Like Ricevuti  
    32
    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?
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    stefano_ non  in linea Scolaretto
    Post
    314
    Like Inviati  
    0
    Like Ricevuti  
    0
    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
    240
    Like Inviati  
    0
    Like Ricevuti  
    0
    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:
     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
    Post
    314
    Like Inviati  
    0
    Like Ricevuti  
    0
    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 Scribacchino
    Post
    539
    Like Inviati  
    9
    Like Ricevuti  
    3
    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.
    '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 18:03  Motivo: Corretta svista in parametro SetForegroundWindow

  7. #7
    stefano_ non  in linea Scolaretto
    Post
    314
    Like Inviati  
    0
    Like Ricevuti  
    0
    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 Scribacchino
    Post
    539
    Like Inviati  
    9
    Like Ricevuti  
    3
    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
    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
    Post
    314
    Like Inviati  
    0
    Like Ricevuti  
    0
    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 Scribacchino
    Post
    539
    Like Inviati  
    9
    Like Ricevuti  
    3
    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 messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risolto: PictureBox in primo piano e Form in secondo piano
    Da cyclope05 nel forum Visual Basic .Net
    Risposte: 5
    Ultimo Post: 25-08-2013, 19:05
  2. (VB6) Form sempre in primo piano.
    Da Vercingetorige nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 12-09-2008, 13:47
  3. Form sempre in primo piano
    Da k17 nel forum Visual Basic .Net
    Risposte: 14
    Ultimo Post: 26-12-2007, 11:12
  4. Form sempre in primo piano
    Da Windows M nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 01-06-2007, 21:18
  5. form in primo piano
    Da Luke nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 17-01-2007, 14:03