IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

comment trouver si un programme "Picasa" est en cours d'éxécution


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut comment trouver si un programme "Picasa" est en cours d'éxécution
    Bonsoir à toutes et tous

    Je voudrais empêcher la mise en veille d'une tablette lorsque j’utilise pour visionner des diaporamas sur picasa qui sont assez long.
    j'ai vu avec la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Long) As Long
     
    Public Enum EXECUTION_STATE 'As Integer
     
        ES_CONTINUOUS = &H80000000
        ES_DISPLAY_REQUIRED = &H2
        ES_SYSTEM_REQUIRED = &H1
        ES_AWAYMODE_REQUIRED = &H40
     
    End Enum
     
    Public Sub PowerSaveOff() 'Shared
        SetThreadExecutionState (EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS)
    End Sub
    voilà pour bloquer la mise en veille

    donc je lance "Picasa"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pathname = "C:\Program Files\Google\Picasa3\Picasa3.exe"
    ret = Shell(pathname, vbNormalFocus)
    mais le problème je ne sais pas quand Picasa sera fermé, et aussitôt qu'il est fermé je veux autoriser à nouveau la mise en veille
    mais comment connaitre l'état du programme Picasa

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut

    Une piste Comment lister les processus actifs sans utiliser l'API Windows (Win2000 et >) ?
    Aprés avoir fait ton Shell, lancé ta fonction de blocage de la veille tu lance un timer pour surveiller les processus et détecter leurs Name, donc pour toi surement Picasa3.exe.
    Quand Picasa3.exe n'est plus dans les processus en cours, tu réautorises l'écran de la mise en veille.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Un programme de démonstration.
    1 Form avec un CommandButton et un Timer avec ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Explicit
     
    Private Sub Command1_Click()
    'C:\Windows\System32\calc.exe
    If DemareProcess("calc.exe") Then
        MsgBox "OK", vbInformation
        Timer1.Enabled = True
        Else
        MsgBox "KO", vbCritical
    End If
    End Sub
     
    Private Sub Form_Load()
    Timer1.Enabled = False
    Timer1.Interval = 2000 ' 2 Sc
    End Sub
     
    Private Sub Timer1_Timer()
    If Not MonProcess("calc.exe") Then
        Timer1.Enabled = False
        MsgBox "Process fini", vbInformation
    End If
    End Sub
    1 Module.bas et ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    Option Explicit
    Private Declare Function SetTimer Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal nIDEvent As Long, _
        ByVal uElapse As Long, _
        ByVal lpTimerFunc As Long) As Long
    'hwnd:
    'Identifie la fenêtre à associer au temporisateur.
    'Cette fenêtre doit être possédée par le fil appelant.
    'Si ce paramètre est NUL, aucune fenêtre n'est associée
    'au temporisateur et le paramètre nIDEvent est ignoré.
     
    'nIDEvent:
    'Indique une marque de non zéro de temporisateur.
    'Si le paramètre de hWnd est NUL, ce paramètre est ignoré
     
    'uElapse:
    'Indique la valeur d'arrêt, en millisecondes.
    'maxi = 2 147 483 647
     
    'lpTimerFunc:
    'Pointeur vers la fonction à annoncer quand la valeur d'arrêt s'écoule.
     
    Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
     
    'pour surveiller les touches clavier
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Public Arreter As Boolean
    Public Sub Main()
    'pour mise au point via l'affichage de Form1 et l'utilisatiion du bouton Command1
    'remer pour travailler en tache de fond, deremer pour afficher le Form et utiliser le Timer1
    'les 2 lignes suivantes pour les essais
    'Form1.Show
    'Exit Sub
    'Fin mise au point via l'affichage de Form1 et l’utilisation du bouton Command1
     
    Dim LeTimer As Long
    Dim Frequence As Long, TimeFreq As Long
     
    'Frequence = 2147483647'millisecondes, soit un maximum de 3 semaines 3 jours 20h 31mn 23sc et 647 msc
    Frequence = 2000 'en millisecondes = 2 Sc
    'Frequence = 60000 'en millisecondes = 1 Mn
    'Frequence = 120000 'en millisecondes = 2 Mn
    'Frequence = 300000 'en millisecondes = 5 Mn
     
    'condition pour démarage et verification que le process a bien démarré
    If Not DemareProcess("calc.exe") Then
        MsgBox "Le process n'a pas démaré", vbCritical
        End
        Else
        MsgBox "le process est OK, surveillance de sa fermeture", vbInformation
        'ici lancer eventuellement une commande avant de débuter la surveillance du process
        Arreter = False
        LeTimer = SetTimer(0, 0, Frequence, AddressOf TimerProc)
        Do While Arreter = False
            DoEvents
            If GetAsyncKeyState(vbKeyControl) And _
                GetAsyncKeyState(vbKeyMenu) And _
                GetAsyncKeyState(vbKeyW) Then
                'detection de ctrl + Alt + w, masque pour éviter des déclenchements non voulues
                'la condition permet de quitter le programme même si le process est encore actif
                MsgBox "Prog de surveillance arrêté", vbInformation + vbSystemModal, ""
                Arreter = True
            End If
            If Not MonProcess("calc.exe") Then
                ' pour demonstration
                MsgBox "le Process a pris fin", vbInformation + vbSystemModal, ""
                'ici lancer éventuellement une commande avant l’arrêt du présent programme
                Arreter = True
            End If
        Loop
        KillTimer 0, LeTimer
    End If
    End Sub
    Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    'cette procédure sera appelée toute les "Frequence"
    Arreter = True 'ici, j'ai choisi d’arrêter le programme
    End Sub
     
    Public Function DemareProcess(ByVal ProcessName As String) As Boolean
        'option, lancement du process
        Shell ProcessName, vbNormalFocus
        ' la suite permet de vérifier que le programme est bien enclenché
        Dim svc As Object
        Dim sQuery As String
        Dim oproc
        Set svc = GetObject("winmgmts:root\cimv2")
        sQuery = "select * from win32_process where name='" & ProcessName & "'"
        For Each oproc In svc.execquery(sQuery)
           If oproc.Name = ProcessName Then DemareProcess = True: Exit For
        Next
        Set svc = Nothing
    End Function
     
    Public Function MonProcess(ByVal ProcessName As String) As Boolean
        'fonction de surveillance fin du process
        Dim svc As Object
        Dim sQuery As String
        Dim oproc
        Set svc = GetObject("winmgmts:root\cimv2")
        sQuery = "select * from win32_process where name='" & ProcessName & "'"
        For Each oproc In svc.execquery(sQuery)
           If oproc.Name = ProcessName Then MonProcess = True: Exit For
        Next
        Set svc = Nothing
    End Function
    Dans les propriétés du projet Alt+p+p, onglet Général, liste Objet de démarrage, choisir Sub Main
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    Bonsoir
    merci pour ta réponse
    mais de mon coté j'ai continué ma prospection
    voici le petit programme qui fonctionne très bien avec Window 8 sur une tablette

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    Option Explicit
     
    Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Long) As Long
    'SetThreadExecutionState Permet à une application d'informer le système qu'il est en cours d'utilisation, _
    '    ce qui empêche le système d'enclencher la mise en veille ou éteindre l'écran _
    '    lorsque l'application est en cours d'exécution.
     
    Public Enum EXECUTION_STATE
        ES_CONTINUOUS = &H80000000 'Informe le système que l'État étant programmée doit rester en vigueur jusqu'à l'appel suivant qui utilise ES_CONTINUOUS et l'un des autres drapeaux de l'Etat est effacé.
        ES_DISPLAY_REQUIRED = &H2 'Force l'affichage soit par la réinitialisation de l'affichage minuteur d'inactivité.
        ES_SYSTEM_REQUIRED = &H1 'Force le système d'être dans l'état de fonctionnement en réinitialisant le système minuteur d'inactivité.
        ES_AWAYMODE_REQUIRED = &H40
    End Enum
    'Valeur de retour
    'Si la fonction réussit, la valeur de retour est l'état d'exécution du thread précédente.
    'Si la fonction échoue, la valeur de retour est NULL .
     
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    Private Type STARTUPINFO 'Indique la station de fenêtre, bureau, poignées standards, et l'apparence de la fenêtre principale d'un processus lors de la création.
       cb As Long
       lpReserved As String
       lpDesktop As String
       lpTitle As String
       dwX As Long
       dwY As Long
       dwXSize As Long
       dwYSize As Long
       dwXCountChars As Long
       dwYCountChars As Long
       dwFillAttribute As Long
       dwFlags As Long
       wShowWindow As Integer
       cbReserved2 As Integer
       lpReserved2 As Long
       hStdInput As Long
       hStdOutput As Long
       hStdError As Long
    End Type
     
    Private Type PROCESS_INFORMATION
       hProcess As Long
       hThread As Long
       dwProcessID As Long
       dwThreadID As Long
    End Type
     
    'fonction WaitForSingleObject va servir à attendre que l'objet passé en paramètre _
     '   atteigne un certain état ou qu'il arrive au bout du temps imparti. _
     '   Cette fonction ne fonctionne pas uniquement pour les threads, _
    '    elle fonctionne aussi pour les changements d'état, les saisies consoles, les événements,...
    Private Declare Function WaitForSingleObject Lib "kernel32" ( _
            ByVal hHandle As Long, _
            ByVal dwMilliseconds As Long) As Long
            'dwMilliseconds [en]L 'intervalle de temps mort, en millisecondes. _
     '       Si une valeur non nulle est spécifié, la fonction attend jusqu'à ce que _
     '       l'objet est signalé ou l'intervalle se écoule. _
    '        Si dwMilliseconds est nul, la fonction ne entre pas dans un état ??d'attente si l'objet ne est pas signalé; elle retourne toujours immédiatement. _
    '        Si dwMilliseconds est INFINITE , la fonction reviendra seulement lorsque l'objet est signalée.
            'Remarque   Le dwMilliseconds valeur ne inclut pas le temps passé dans les Etats de faible puissance. _
    '        Par exemple, le délai d'attente ne sera pas garder le compte à rebours lorsque l'ordinateur est en veille.
     
    Private Declare Function CreateProcessA Lib "kernel32" ( _
         ByVal lpApplicationName As String, _
         ByVal lpCommandLine As String, _
         ByVal lpProcessAttributes As Long, _
         ByVal lpThreadAttributes As Long, _
         ByVal bInheritHandles As Long, _
         ByVal dwCreationFlags As Long, _
         ByVal lpEnvironment As Long, _
         ByVal lpCurrentDirectory As String, _
         lpStartupInfo As STARTUPINFO, _
         lpProcessInformation As _
         PROCESS_INFORMATION) As Long
    'lpApplicationName As String (facultaif) :La chaîne peut spécifier le chemin complet et le nom du module à exécuter ou il peut spécifier un nom partiel. Dans le cas d'une partie du nom, la fonction utilise le lecteur en cours et le répertoire en cours pour compléter la spécification. La fonction ne sera pas utiliser le chemin de recherche. Ce paramètre doit inclure l'extension de nom de fichier; pas d'extension par défaut est supposé.
                        'Ce paramètre peut être NULL . Dans ce cas, le nom du module doit être le premier jeton séparés par des espaces blancs dans le lpCommandLine
    'lpCommandLine As String, [in, out, facultatif]La ligne de commande à exécuter. La longueur maximale de cette chaîne est 32 768 caractères, y compris le caractère nul de terminaison Unicode. Si IpApplicationName est NULL , la partie nom du module de lpCommandLine est limitée à MAX_PATH caractères.
                        'Le lpCommandLine paramètre peut être NULL. Dans ce cas, la fonction utilise la chaîne pointée par IpApplicationName que la ligne de commande.
    'lpProcessAttributes [in, facultatif] Un pointeur vers une SECURITY_ATTRIBUTES structure qui détermine si le handle retourné au nouvel objet de processus peut être héritée par les processus enfants. Si lpProcessAttributes est NULL , la poignée ne peut pas être héritée.
    'lpThreadAttributes [in, facultatif]
    'Un pointeur vers une SECURITY_ATTRIBUTES structure qui détermine si le handle retourné au nouvel objet de fil peut être hérité par les processus enfants. Si lpThreadAttributes est NULL, la poignée ne peut pas être héritée. _
    'bInheritHandles [en] Si ce paramètre TRUE, chaque poignée héréditaire dans le processus d'appel est héritée par le nouveau processus. Si le paramètre est FAUX, les poignées ne sont pas héritées. Notez que les poignées héritées ont les mêmes droits de valeur et accès que les poignées d'origine. _
    'dwCreationFlags [en]Les drapeaux qui contrôlent la classe de priorité et la création du processus. Pour une liste des valeurs, voir Drapeaux processus de création . _
    'lpEnvironment [in, facultatif]Un pointeur vers le bloc d'environnement pour le nouveau processus. Si ce paramètre est NULL , le nouveau procédé utilise l'environnement du processus d'appel. _
    'lpCurrentDirectory [in, facultatif] Le chemin complet vers le répertoire courant pour le processus. La chaîne peut également spécifier un chemin UNC.
                        'Si ce paramètre est NULL , le nouveau processus aura le même lecteur et le répertoire que le processus d'appel. _
    'lpStartupInfo [en]Un pointeur vers une STARTUPINFO ou STARTUPINFOEX structure.
                        'Poignées dans STARTUPINFO ou STARTUPINFOEX doivent être fermées avec CloseHandle quand ils ne sont plus nécessaires.
     'lpProcessInformation [out]Un pointeur vers une PROCESS_INFORMATION structure qui reçoit des informations d'identification sur le nouveau processus.
                    'Poignées dans PROCESS_INFORMATION doivent être fermées avec CloseHandle quand ils ne sont plus nécessaires.
    'Valeur de retour
    'Si la fonction réussit, la valeur de retour est différent de zéro.
    'Si la fonction échoue, la valeur de retour est zéro. Pour obtenir des informations sur l'erreur, appelez GetLastError .
    'Notez que la fonction retourne avant que le processus a terminé l'initialisation. Si une DLL requise ne peut être situé ou ne se initialise pas, le processus est terminé. Pour obtenir le statut de terminaison d'un processus, appeler GetExitCodeProcess .
     
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
    'Récupère le statut de terminaison du processus spécifié.
    Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
        ByVal hProcess As Long, _
        lpExitCode As Long) As Long
        'lpExitCode [out]Un pointeur vers une variable pour recevoir le statut de la fin du processus.
     
    Private Const NORMAL_PRIORITY_CLASS = &H20&
    Private Const INFINITE = -1&
       '
     
    Public Function ExecCmd(cmdline$)
     
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    Dim ret As Long
    ' Initialisez la structure STARTUPINFO :
    start.cb = Len(start)
     
    ' Démarrez l'application Shell :
    ret = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc)
     
    SleepOff 'désactivation de la mise en veille
     
    ' Attendez la fin de l'application Shell :
    ret = WaitForSingleObject(proc.hProcess, INFINITE)
    Call GetExitCodeProcess(proc.hProcess, ret)
    Call CloseHandle(proc.hThread)
    Call CloseHandle(proc.hProcess)
     
    SleepOn 'Activation de la mise en veille
    ExecCmd = ret
     
    End Function
     
    Private Sub Main()
          Dim retval As Long
     
          retval = ExecCmd("C:\Program Files\Google\Picasa3\Picasa3.exe")
    '       REMARQUE:L 'instruction de la boîte de message suivant la fonction ExecCmd ()
    '      n 'est pas exécutée car la fonction WaitForSingleObject () l'en empêche.
    '      La boîte de message apparaît uniquement lorsque
    '      le Bloc-notes est fermé à l'aide de l'élément Quitter du menu Fichier du Bloc-notes (ALT, F, X).
     
          'MsgBox "Le processus est terminé, code de sortie " & retval
     
    End Sub
     
     
    Public Sub SleepOff()
        SetThreadExecutionState (EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS)
    End Sub
     
    Public Sub SleepOn()
        SetThreadExecutionState (EXECUTION_STATE.ES_CONTINUOUS)
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/02/2013, 00h15
  2. vérifier si un programme est en cours d'éxécution
    Par Jasmine80 dans le forum Langage
    Réponses: 11
    Dernier message: 15/02/2009, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo