Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    6

    [VBA] Lanciare o terminare un programma già in esecuzione

    Ciao a tutti

    Ho trovato in questo forum il metodo per mandare in run un eseguibile da VBA (tramite shell(..)) ed anche il metodo tramite GetObject per terminarlo. Ad esempio

    Dim obj As Object
    For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='calc.exe'")
    obj.Terminate
    Next

    Se invece l'eseguibile fosse già in run come posso dargli il focus che lo porta in foreground?

    Questo perché quello che devo fare è, in un sistema di automazione, al presentarsi di un certo evento, dall'HMI attivare (lanciare un exe) un programma. Tale programma può essere poi mandato in background. Se il programma è già in run devo portarlo in foreground (sull'evento di cui sopra).
    Il metodo alternativo è quello di terminarlo e rilanciarlo ogni volta.
    In ogni caso non capisco che classe sia object, in VBA dopo il . non mi fa vedere i metodi ..ecc.. della classe. Ad esempio se nello stralcio di codice qui sopra se digito obj. non mi compaiono le opzioni.

    Saluti

  2. #2
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,994
    codice:
    Dim pid
    Sub OpenApplication()
        If pid = 0 Then 'Application not already open
            pid = Shell("notepad.exe", vbNormalFocus)
        Else 
            AppActivate (pid)
        End If
    End Sub
    oppure seguendo il codice da te postato
    codice:
    Sub tofront()
    For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='notepad.exe'")
    AppActivate (obj.ID)
    Next
    End Sub
    Ultima modifica di patel; 10-05-2018 a 18:53

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    6
    Grazie

    Ti chiedo questo perchè adesso sono nell'impossibilità di provare. Appactivate manda l'applicazione in foreground? Quando si interroga la GetObject("winmgmts:") l'oggetto obj non mi potrebbe dire se l'app è in run e non mi da una reference per terminarlo o eventualmente portarlo in primo piano?

    Ciao

  4. #4
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,994
    vedi post #2 modificato

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    6

    Lanciare o terminare un eseguibile da vb o vba

    Quote Originariamente inviata da patel Visualizza il messaggio
    vedi post #2 modificato
    Ok. Le info relative ai campi di questo obj non sono riuscito a trovarle. Mi sai mica indicare dove le trovo? Ho cercato su msdn ma o non ho capito o non le ho trovate. Ho cercato classe object.
    Supponiamo che io lanci l'applicazione, supponiamo diverse volte e con parametri diversi. Ad esempio il notepad una volta con un file e una volta con un altro. Tramite l'obj riesco ad identificare quella fra le altre che ha usato quel determinato parametro?
    Grazie
    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    6
    Quote Originariamente inviata da patel Visualizza il messaggio
    codice:
    Dim pid
    Sub OpenApplication()
        If pid = 0 Then 'Application not already open
            pid = Shell("notepad.exe", vbNormalFocus)
        Else 
            AppActivate (pid)
        End If
    End Sub
    oppure seguendo il codice da te postato
    codice:
    Sub tofront()
    For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='notepad.exe'")
    AppActivate (obj.ID)
    Next
    End Sub
    In definitiva dovrei interrogare il sistema se c'è una certa applicazione, magari con certi parametri di lancio, già in run e se si ne faccio l'Appactivate per averla in foreground. Se non c'è devo lanciarla con i parametri necessari
    Ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    6
    Quote Originariamente inviata da patel Visualizza il messaggio
    codice:
    Dim pid
    Sub OpenApplication()
        If pid = 0 Then 'Application not already open
            pid = Shell("notepad.exe", vbNormalFocus)
        Else 
            AppActivate (pid)
        End If
    End Sub
    oppure seguendo il codice da te postato
    codice:
    Sub tofront()
    For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='notepad.exe'")
    AppActivate (obj.ID)
    Next
    End Sub

    AppActivate (obj.ID) mi da il seguente errore nella popup window di Microsoft Visual Basic

    Run time error '438': Object doesn't support this property or method

    Ciao

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    In quale ambiente stai facendo girare il codice esattamente?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2018
    Messaggi
    6
    S.O Win 10 pro v1511
    Il VBA è quello integrato nel prodotto Factory Talk View Site Edition di Rockwell per HMI (Scada)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.