Liste de process word et excel via api

Liste de process word et excel via api - VB/VBA/VBS - Programmation

Marsh Posté le 25-08-2003 à 16:45:56    

salut  :)  
 
Avec le code suivant (utilisation d'API):

Citation :


        hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0& )
         
        If hSnapshot = 0 Then Exit Sub
             
        'parcours des process
        uProcess.dwSize = Len(uProcess)
        r = ProcessFirst(hSnapshot, uProcess)
        Do While r
            'Word
            If InStr(1, UCase(uProcess.szexeFile), "WINWORD.EXE" ) And WinWord Then
                NbWord = NbWord + 1
                ProcessManagerWindow.FGrid_Word.AddItem uProcess.th32ProcessID & Chr(9) & "nom fenetre" & Chr(9) & "00" & Chr(9) & " ", 1
            End If
            'Excel
            If InStr(1, UCase(uProcess.szexeFile), "EXCEL.EXE" ) And Excel Then
                NbExcel = NbExcel + 1
                ProcessManagerWindow.FGrid_Excel.AddItem uProcess.th32ProcessID & Chr(9) & "nom fenetre" & uProcess.th32ProcessID & Chr(9) & "00" & Chr(9) & " ", 1
            End If
                 
            r = ProcessNext(hSnapshot, uProcess)
        Loop


 
je peux lister les process word et excel. je voudrais en plus, savoir l'intitulé des fenetres des process pas mort (genre 'Microsoft excel - fichier1.xls' ) et le % en cpu...Vous pouvez m'aider ???  :heink:


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 25-08-2003 à 16:45:56   

Reply

Marsh Posté le 26-08-2003 à 14:34:05    

mouff a écrit :

salut  :)  
 
Avec le code suivant (utilisation d'API):

Citation :


        hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0& )
         
        If hSnapshot = 0 Then Exit Sub
             
        'parcours des process
        uProcess.dwSize = Len(uProcess)
        r = ProcessFirst(hSnapshot, uProcess)
        Do While r
            'Word
            If InStr(1, UCase(uProcess.szexeFile), "WINWORD.EXE" ) And WinWord Then
                NbWord = NbWord + 1
                ProcessManagerWindow.FGrid_Word.AddItem uProcess.th32ProcessID & Chr(9) & "nom fenetre" & Chr(9) & "00" & Chr(9) & " ", 1
            End If
            'Excel
            If InStr(1, UCase(uProcess.szexeFile), "EXCEL.EXE" ) And Excel Then
                NbExcel = NbExcel + 1
                ProcessManagerWindow.FGrid_Excel.AddItem uProcess.th32ProcessID & Chr(9) & "nom fenetre" & uProcess.th32ProcessID & Chr(9) & "00" & Chr(9) & " ", 1
            End If
                 
            r = ProcessNext(hSnapshot, uProcess)
        Loop


 
je peux lister les process word et excel. je voudrais en plus, savoir l'intitulé des fenetres des process pas mort (genre 'Microsoft excel - fichier1.xls' ) et le % en cpu...Vous pouvez m'aider ???  :heink:  

le % du CPU, ce n'est pas du tout la même API, c'est une fonction qui appartient à la *.dll, kernel32.dll. J'ai oublié son nom depuis, mais tu la trouveras dans API windows (cf ma signature). Aprés si tu veux savoir le pourcentage que prend chaque fichier excel ouvert, je ne sais pas, c'est peut-être une variante de l'API dont je te parle (tu as même l'exemple).

Reply

Marsh Posté le 26-08-2003 à 14:40:17    

bon ben je vais regarder une à une  [:joker]


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 26-08-2003 à 14:41:42    

mouff a écrit :

bon ben je vais regarder une à une  [:joker]  

c'est cell-ci. Une fois comprise, par des calculs que tu n'as pas dans l'exemple te permettront de trouver le pourcentage de mémoire disponible...
 

Code :
  1. Declare Sub GlobalMemoryStatus Lib "kernel32" ( _
  2.                  lpBuffer As MEMORYSTATUS)
  3. Versions :
  4. . Windows 95/98 : Oui
  5. . Windows NT : A partir de 3.1
  6. . Windows 2000/XP : Oui
  7. Description :
  8. (Origine : int19h - Int19h@caramail.com)
  9. Cette API permet de savoir la quantité de mémoire physique et virtuelle disponible sur l'ordinateur ainsi que l'espace libre.
  10. Utilise une structure MEMORYSTATUS pour stocker le résultat.
  11. dwLength est la taille de la structure.
  12. dwMemoryLoad est le pourcentage de mémoire actuellement utilisé.
  13. dwTotalPhys est la taille totale de la mémoire physique (en octets).
  14. dwAvailPhys est la taille de la mémoire physique disponible (en octets).
  15. dwTotalPageFile donne la taille totale que peut atteindre le fichier d'échange (en octets).
  16. dwAvailPageFile indique l'espace disponible dans le fichier d'échange (en octets).
  17. dwTotalVirtual retourne la mémoire totale pouvant être utilisée par l'application courante (en octets).
  18. dwAvailVirtual représente l'espace libre totale (en octets).
  19. Type MEMORYSTATUS
  20.     dwLength As Long
  21.     dwMemoryLoad As Long
  22.     dwTotalPhys As Long
  23.     dwAvailPhys As Long
  24.     dwTotalPageFile As Long
  25.     dwAvailPageFile As Long
  26.     dwTotalVirtual As Long
  27.     dwAvailVirtual As Long
  28. End Type
  29. Exemple d'utilisation :
  30. ' Exemple par int19h (Int19h@caramail.com)
  31. ' Placer le code sur une form vide
  32. Private Sub Form_Load()
  33. Dim Memoire As MEMORYSTATUS
  34. Me.AutoRedraw = True
  35. ' Récupère les informations
  36. GlobalMemoryStatus Memoire
  37. ' Affiche les informations sur la feuille
  38. Print "Mémoire Physique Totale = ";
  39. Print Format(Memoire.dwTotalPhys, "###,###,### octets " )
  40. Print "Mémoire Physique Libre = ";
  41. Print Format(Memoire.dwAvailPhys, "###,###,### octets" );
  42. Print " (" & Int((Memoire.dwAvailPhys / Memoire.dwTotalPhys) * 100) & "% libres)."
  43. End Sub


Message édité par cvb le 26-08-2003 à 14:42:45
Reply

Marsh Posté le 26-08-2003 à 14:49:35    

ne sachant combien de mem prend mes process, je vois pas comment à partir de cette fonction api, je peux en déduire le %cpu pour chaque process  :heink:


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 26-08-2003 à 14:55:05    

pour chaque process, je ne sais pas, par contre, tu as le pourcentage total utilisé "dwMemoryLoad est le pourcentage de mémoire actuellement utilisé." et ça, "dwTotalVirtual retourne la mémoire totale pouvant être utilisée par l'application courante (en octets)". Pour le reste, je sais plus. Essaye d'aller sur www.vbfrance.com pour voir si tu trouves la solution à ton problème... [:spamafote]

Reply

Marsh Posté le 27-08-2003 à 11:43:46    

pour la partie 'libel' de la fenetre, voici ce que j'ai reussi a faire finalement.
 
mon code précédent me donner l'instance du process mais pas de la fenetre (ce qui peut se reveler different). Et j'avais besoin de passer par la liste des process et non des handles fenetres pour x raisons (dont la possibilité de voir les instances excel/word ouvertes en ole...) donc, en donnant le pid du process, la fonction qui suit va me chercher le texte de la fenetre si existe   ;)  
 

Citation :


Private Function GetProcessText(lProcessID As Long) As String
    'recherche du texte window du process concerné
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long, lenS As Long
    Dim Text As String
     
    GetProcessText = "N/A" 'Not Available"
     
    'se place sur la premiere fenetre
    test_hwnd = FindWindow(ByVal 0&, ByVal 0& )
    Do While test_hwnd <> 0
        'verification si la fenetre n'est pas une fenetre child
        If GetParent(test_hwnd) = 0 Then
            'on cherche l'id de la fenetre
            test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
            If test_pid = lProcessID Then
                'process concerné
                lenS = GetWindowTextLength(test_hwnd)
                Text = Space$(lenS + 1)
                lenS = GetWindowText(test_hwnd, Text, lenS + 1)
                Text = Left$(Text, Len(Text) - 1)
                'texte valid pour une fenetre visible
                If lenS <> 0 And Text <> "" And IsWindowVisible(test_hwnd) Then
                    GetProcessText = Text
                    Exit Do
                End If
            End If
        End If
        'retrieve the next window
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function


 
Par contre, je trouve toujours pas pour le %CPU   :sweat:  


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 27-08-2003 à 12:18:40    

mouff a écrit :

pour la partie 'libel' de la fenetre, voici ce que j'ai reussi a faire finalement.
 
mon code précédent me donner l'instance du process mais pas de la fenetre (ce qui peut se reveler different). Et j'avais besoin de passer par la liste des process et non des handles fenetres pour x raisons (dont la possibilité de voir les instances excel/word ouvertes en ole...) donc, en donnant le pid du process, la fonction qui suit va me chercher le texte de la fenetre si existe   ;)  
 

Citation :


Private Function GetProcessText(lProcessID As Long) As String
    'recherche du texte window du process concerné
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long, lenS As Long
    Dim Text As String
     
    GetProcessText = "N/A" 'Not Available"
     
    'se place sur la premiere fenetre
    test_hwnd = FindWindow(ByVal 0&, ByVal 0& )
    Do While test_hwnd <> 0
        'verification si la fenetre n'est pas une fenetre child
        If GetParent(test_hwnd) = 0 Then
            'on cherche l'id de la fenetre
            test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
            If test_pid = lProcessID Then
                'process concerné
                lenS = GetWindowTextLength(test_hwnd)
                Text = Space$(lenS + 1)
                lenS = GetWindowText(test_hwnd, Text, lenS + 1)
                Text = Left$(Text, Len(Text) - 1)
                'texte valid pour une fenetre visible
                If lenS <> 0 And Text <> "" And IsWindowVisible(test_hwnd) Then
                    GetProcessText = Text
                    Exit Do
                End If
            End If
        End If
        'retrieve the next window
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function


 
Par contre, je trouve toujours pas pour le %CPU   :sweat:  


si tu arrive à savoir combien de RAM te prend les process ouvert, tu peux ensuite faire une régle de 3 avec l'API que t'as été voir hier. Elle te permet de trouver la RAM libre et tu as une variable qui te donne ce que sa prend en charge pour le CPU...
 
*************
régle de 3
*************
 
 
% CPU machine (variable. dwMemoryLoad de l'API GlobalMemoryStatus) -----------> RAM prise (API windows GlobalMemoryStatus. Ce sont des calculs entre les secteur libre,ect...va voir l'exemple)
 
valeure aprés calcul du CPU -----------> RAM que te prenne les process (c'est à toi de trouver. comment, aucune idée !)
 
**************
 
je ne vois pas d'autre solution  [:spamafote]


Message édité par cvb le 27-08-2003 à 12:19:30
Reply

Marsh Posté le 27-08-2003 à 13:05:01    

attend attend, le %CPU n'est pas une valeur par rapport au temps de calcul du processeur de la machine ??? Ca n'a normalement aucun lien avec la RAM  :heink:


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 27-08-2003 à 13:19:46    

mouff a écrit :

attend attend, le %CPU n'est pas une valeur par rapport au temps de calcul du processeur de la machine ??? Ca n'a normalement aucun lien avec la RAM  :heink:  


 
 
le liens se trouve où ? Dés que tu fais monter la RAM tu vois la courbe du % CPU s'affoler, s'il y a d'autre facteur, je les connais pas... [:spamafote]

Reply

Marsh Posté le 27-08-2003 à 13:19:46   

Reply

Marsh Posté le 27-08-2003 à 13:24:04    

evidemment quand un calcul se fait, le process nécessite la ram pour stock ces variables, mais clairement, les %CPU ne sont pas intrinséquement liés avec le %RAMutilisé pour déduire une équation entre ces deux valeurs.
 
où alors une putain d'équation mathématique à n-variables que je mettrais 15 ans à comprendre  [:joker]


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 27-08-2003 à 13:26:00    

mouff a écrit :

evidemment quand un calcul se fait, le process nécessite la ram pour stock ces variables, mais clairement, les %CPU ne sont pas intrinséquement liés avec le %RAMutilisé pour déduire une équation entre ces deux valeurs.
 
où alors une putain d'équation mathématique à n-variables que je mettrais 15 ans à comprendre  [:joker]  


sur www.vbfrance.com, tu n'as pas trouvé d'exemple sur le calcul des ressources machine ou l'équation dont tu parles ?

Reply

Marsh Posté le 27-08-2003 à 13:32:26    

nop, juste trouve comment avoir le CPU global ou comment avoir le graph.
 
juste trouvé ça http://www.vbfrance.com/forum.aspx?Article=76275 qui m'a aussi calmé un peu  :whistle:  
mais, je ne desespére pas  :D  
 


---------------
Il suffit de me dire de me taire...
Reply

Marsh Posté le 27-08-2003 à 13:43:59    

mouff a écrit :

nop, juste trouve comment avoir le CPU global ou comment avoir le graph.
 
juste trouvé ça http://www.vbfrance.com/forum.aspx?Article=76275 qui m'a aussi calmé un peu  :whistle:  
mais, je ne desespére pas  :D  
 
 


 
VB et le courage sa va ensemble !  [:ddr555]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed