API EnumWindows et postmessage

Signaler
Messages postés
25
Date d'inscription
lundi 14 mai 2007
Statut
Membre
Dernière intervention
23 janvier 2008
-
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
-
Bonjour, je cherche à fermer toutes les fenêtres ouvertes (sans toucher aux process de windows et sans toucher à une fenêtre dont je connais le nom), il faut donc que je fasse appel aux API EnumWindows et PostMessage mais l'utilisation de EnumWindows me pose problème... Je ne sais pas comment utiliser EnumWindows ni comment récupérer les résultats qu'elle doit me renvoyer.

Est-ce que quelqu'un peut m'aider ?

6 réponses

Messages postés
25
Date d'inscription
lundi 14 mai 2007
Statut
Membre
Dernière intervention
23 janvier 2008

Hm, en fait il ne me reste plus qu'à savoir comment on stocke et exploite les handles que nous renvoie EnumWindows...
Messages postés
25
Date d'inscription
lundi 14 mai 2007
Statut
Membre
Dernière intervention
23 janvier 2008

En fait ça marche, mais il me reste juste à empêcher la fermeture de mon programme :s

Voila ce que j'ai fait déja :

Private Sub frm_principal_Load()
    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim sSave As String, Ret As Long
    Ret = GetWindowTextLength(hwnd)
    sSave = Space(Ret)
    GetWindowText hwnd, sSave, Ret + 1
    Handle_prj = frm_principal.hwnd
    If hwnd <> Handle_prj Then
        PostMessage hwnd, &H10, 0, 0
    End If
    EnumWindowsProc = True
End Function

Le problème c'est que ça me ferme aussi mon programme !

Là je ne comprends plus rien...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Exemple ici, faudra traduire en VB:
PROG EGOISTE (WIN32,VC++,ASM)
http://www.cppfrance.com/code.aspx?id=10371

ciao...
BruNews, MVP VC++
Messages postés
25
Date d'inscription
lundi 14 mai 2007
Statut
Membre
Dernière intervention
23 janvier 2008

C'est pas que j'ai pas essayé de comprendre, mais déja je ne connais rien en cpp mais en plus faire une traduction...
Messages postés
266
Date d'inscription
mardi 7 septembre 2004
Statut
Membre
Dernière intervention
30 avril 2009
1
Deux sites en français totalement:


API @ la Loupe / VB researrch center


slts!

---------------------------------------------------

Toujours + de VB et d'API => APi @ la Loupe

http://apialaloupe.free.fr
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Le problème c'est que ça me ferme aussi mon programme !


là tu m'étonnes , j'imagine mal ce qui doit se passer ...
t'es en train de fermer toutes les fenêtres, les visibles, les invisibles, y compris même progman manager, etc ...

pour avoir une idée de ce que tu fermes:
voilà une Liste de toutes les fenêtres en cours dans une ListView (sans subclassing)
la ListView s'appelle LV.
je te laisse faire les déclarations et définitions

Private Sub Form_Load()
    Lv.ColumnHeaders.Add , , "Hwnd", 60
    Lv.ColumnHeaders.Add , , "Classe", 125
    Lv.ColumnHeaders.Add , , "NOM", 200
    Lv.ColumnHeaders.Add , , "Taille", 75
    MHwnd = Me.hwnd
    EnumWindows
End Sub

Function EnumWindows()
    Dim Ligne      As ListItem
    Dim hwnd       As Long
    Dim Lg         As Long
    Dim Rp         As Long
    Dim Rs         As Long
    Dim zRw        As Long
    Dim zRh        As Long
    Dim Nom        As String
    Dim Class      As String
    Dim Tr         As RECT
   
    hwnd = GetDesktopWindow()
    hwnd = GetWindow(hwnd, GW_CHILD)
    Do While hwnd <> 0
       Rp = IsWindowVisible(hwnd)
'      If Rp = 0 Then GoTo 10
       Rp = IsIconic(hwnd)
'      If Rp > 0 Then GoTo 10
'      If hwnd = MHwnd Then GoTo 10
      
       Lg = GetWindowTextLength(hwnd)
'      If Lg = 0 Then GoTo 10
      
       Rp = GetWindowRect(hwnd, Tr)
       zRw = Tr.Right - Tr.Left
'      If zRw = 0 Then GoTo 10
       zRh = Tr.Bottom - Tr.Top
'      If zRh = 0 Then GoTo 10
      
       Nom = Space$(Lg + 1)
       GetWindowText hwnd, Nom, Lg + 1
       Nom = Left$(Nom, Lg)
       Class = Space$(120)
       Lg = GetClassName(hwnd, Class, 120)
       Class = Left$(Class, Lg)
'      If Class = "ThunderRT6PictureBoxDC" Then GoTo 10
'      If Class = "Shell_TrayWnd" Then GoTo 10
'      If Class = "IEFrame" then goto 10
'      if Class = "ThunderRT6FormDC" Then goto 10
      
       Set Ligne = Lv.ListItems.Add
       Ligne.Text = Format$(hwnd, "00000000")
       Ligne.SubItems(1) = Class
       Ligne.SubItems(2) = Nom
       Ligne.SubItems(3) = zRw & "x" & zRh
        
10     hwnd = GetWindow(hwnd, GW_HWNDNEXT)
       Loop

End Function

Daniel