J'ai ajouté _GUICtrlListView_RegisterSortCallBack pour qu'on puisse trier la liste quand on clique sur une colonne. Ca trie bien ma liste mais quand un élément est ajouté, celui-ci n'est pas trier, je dois le faire manuellement (ce que je fais avec la fonction trieListe()). Le problème c'est qu'en faisant comme ça, comme je l'ai dit plus haut, l'icône ne change pas de place.
► Afficher le textepour voir un exemple
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <Process.au3>
#include <Constants.au3>
#include <Date.au3>
#include <WinAPI.au3>
#include <GuiHeader.au3>
;~ Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)
Opt("GUICloseOnESC", 1)
; // // // // // // // // // // // // // // // // // // // // //
; //
; //
; // déclaration des variables
; //
; //
; // // // // // // // // // // // // // // // // // // // // //
Global $a_listeProcessus[1][10]
Global $a_listeProcessusMAJ[1][10]
Global $a_listViewItems[1]
Global $indexColonne = -1
; // // // // // // // // // // // // // // // // // // // // //
; //
; //
; // création de l'interface graphique
; //
; //
; // // // // // // // // // // // // // // // // // // // // //
Global $fenetrePrincipale = GUICreate( _
"ListView Click Item", _
600, 450, -1, -1, _
BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
;~ Global $idListView = GUICtrlCreateListView("Nom|PID|Priorité|Emplacement", _
;~ 0, 0, 600, 320, _
;~ BitOR($GUI_DOCKBOTTOM, $LVS_SORTASCENDING))
Global $idListView = GUICtrlCreateListView("Nom|PID|Priorité|Emplacement", _
0, 0, 600, 320, _
$GUI_DOCKBOTTOM)
Global $hListView = GUICtrlGetHandle($idListView)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quitte")
; //
; //
; // chargement de la liste des programmes
; //
; //
initialise_listeProcessus()
; //
; //
; // chargement des notifications
; //
; //
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
; //
; //
; // divers
; //
; //
_GUICtrlListView_RegisterSortCallBack($hListView)
GUISetState() ; affiche l'interface graphique
; //
; //
; // >>> exemple pour montrer le problème
; //
; //
MsgBox(0,"","La liste des processus est chargée")
$indexColonne=0
_GUICtrlListView_SortItems($hListView, $indexColonne) ; trie une la liste
MsgBox(0,"","La liste des processus viens d'être triée avec _GUICtrlListView_SortItems()")
Run("notepad")
WinWait("Sans titre - Bloc-notes")
rafraichitListeProgrammes()
MsgBox(0,"","Notepad est lancé, la liste viens d'être rafraichie mais le processus s'affiche en bas de celle-ci, il faut donc la trier...")
trieListe()
MsgBox(0,"Et c'est le drame !","Problème : l'icône de Notepad s'affiche en bas... De plus, l'icône de Notepad qui vient d'être trié n'est pas celle de Notepad.")
; //
; //
; // boucle principale
; //
; //
While 1
rafraichitListeProgrammes()
Sleep(1000)
WEnd
Func rafraichitListeProgrammes()
Local $i, $index
Local $horsTableau = False
Local $elementAjoute = False
; met à jour la liste des processus
$a_listeProcessusMAJ = ProcessList()
ReDim $a_listeProcessusMAJ[UBound($a_listeProcessusMAJ)][10]
$a_listeProcessusMAJ[0][0] = "idle"
$total_a_listeProcessus = UBound($a_listeProcessus) - 1
$total_a_listeProcessusMAJ = UBound($a_listeProcessusMAJ) - 1
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; *
; *
; * ajoute dans la liste les processus nouvellement créés
; *
; *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
;
ReDim $a_listViewItems[$total_a_listeProcessusMAJ + 1]
For $i = 0 To $total_a_listeProcessusMAJ
If $total_a_listeProcessus >= $i Then ; vérifie qu'on ne dépasse pas les limites de la taille du tableau
; si le PID ne correspond pas ou...
; si le nom du processus ne correspond pas
; alors il faut rechercher le processus dans tout le tableau
; s'il n'a pas été trouvé il faut l'ajouter dans la liste
If $a_listeProcessus[$i][1] <> $a_listeProcessusMAJ[$i][1] Or _
$a_listeProcessus[$i][0] <> $a_listeProcessusMAJ[$i][0] Then
; recherche le processus
$index = _ArraySearch($a_listeProcessus, _
$a_listeProcessusMAJ[$i][1], _
0, 0, 0, 0, 1, 1)
EndIf
Else
$horsTableau = True
EndIf
; si le processus n'a pas été trouvé alors
; il faut l'ajouter dans la liste
If $index = -1 Or $horsTableau Then
$a_listeProcessusMAJ[$i][7] = recupereEmplacementProcessus($a_listeProcessusMAJ[$i][1])
; ajoute les éléments concernant le processus dans les colonnes
$a_listViewItems[$i] = GUICtrlCreateListViewItem( _ ; $i + 1 car le 0 compte
$a_listeProcessusMAJ[$i][0] & "|" & _ ; nom du processus
$a_listeProcessusMAJ[$i][1] & "|" & _ ; PID
$a_listeProcessusMAJ[$i][6] & "|" & _ ; priorité
$a_listeProcessusMAJ[$i][7], _ ; emplacement
$idListView)
;~ trieListe()
If $a_listeProcessusMAJ[$i][7] Then GUICtrlSetImage($a_listViewItems[$i], $a_listeProcessusMAJ[$i][7], 0) ; ajoute des images
$index = UBound($a_listViewItems) - 1
Else
$index = $i ; index de l'élément (celui en cours)
EndIf
Next
; met à jour l'ancien tableau qui contient la liste des programmes
$a_listeProcessus = $a_listeProcessusMAJ
;~ If $elementAjoute Then trieListe() ; si un élément a été ajouté alors il faut trier la liste
EndFunc ;==>rafraichitListeProgrammes
Func initialise_listeProcessus()
Local $i, $index
; met à jour la liste des processus
$a_listeProcessus = ProcessList()
ReDim $a_listeProcessus[UBound($a_listeProcessus)][10]
$a_listeProcessus[0][0] = "idle"
ReDim $a_listViewItems[UBound($a_listeProcessus)]
; *
; * ajoute dans la liste les processus nouvellement créés
; *
For $i = 0 To UBound($a_listeProcessus) - 1
$a_listeProcessus[$i][7] = recupereEmplacementProcessus($a_listeProcessus[$i][1])
$prioriteProcessus = $a_listeProcessus[$i][6] ; priorité
If @error Then $prioriteProcessus = 6
; ajoute les éléments concernant le processus dans les colonnes
$a_listViewItems[$i] = GUICtrlCreateListViewItem( _
$a_listeProcessus[$i][0] & "|" & _ ; nom du processus
$a_listeProcessus[$i][1] & "|" & _ ; PID
$prioriteProcessus & "|" & _ ; priorité
$a_listeProcessus[$i][7], _ ; emplacement
$idListView)
If $a_listeProcessus[$i][7] Then GUICtrlSetImage(-1, $a_listeProcessus[$i][7], 0) ; ajoute des images
If $a_listeProcessus[$i][4] = 0 Then ; si le processus n'est pas en suspend
GUICtrlSetBkColor($a_listViewItems[$i], _
$GUI_BKCOLOR_TRANSPARENT)
Else ; si le processus est en suspend
GUICtrlSetBkColor($a_listViewItems[$i], _
0xff0000)
EndIf
Next
; taille automatique des colonnes
For $i = 0 To _GUICtrlListView_GetColumnCount($hListView) - 1
_GUICtrlListView_SetColumnWidth($hListView, $i, $LVSCW_AUTOSIZE)
Next
;~ trieListe()
EndFunc ;==>initialise_listeProcessus
Func recupereEmplacementProcessus($pid)
Local $processus, $modulesProcessus, $r
$processus = DllCall("kernel32.dll", "hwnd", "OpenProcess", _
"int", BitOR($PROCESS_QUERY_INFORMATION, $PROCESS_VM_READ), _
"int", 0, _
"int", $pid)
If $processus[0] = 0 Then Return SetError(1)
$modulesProcessus = DllStructCreate("int[1024]")
DllCall("psapi.dll", "int", "EnumProcessModules", _
"hwnd", $processus[0], _
"ptr", DllStructGetPtr($modulesProcessus), _
"int", DllStructGetSize($modulesProcessus), _
"int_ptr", 0)
$r = DllCall("psapi.dll", "int", "GetModuleFileNameEx", _
"hwnd", $processus[0], _
"int", DllStructGetData($modulesProcessus, 1), _
"str", "", _
"int", 2048)
$modulesProcessus = 0
If StringLen($r[3]) = 0 Then Return SetError(1)
Return $r[3]
EndFunc ;==>recupereEmplacementProcessus
Func supprimeProcessusDeLaListe($index)
GUICtrlDelete($a_listViewItems[$index]) ; supprime l'élément de la liste
_ArrayDelete($a_listViewItems, $index) ; supprime l'élément du tableau
EndFunc ;==>supprimeProcessusDeLaListe
; supprime tous les éléments de la liste
Func supprimeTousLesElementsDansListe()
For $i = 0 To UBound($a_listViewItems) - 1
GUICtrlDelete($a_listViewItems[$i]) ; supprime l'élément de la liste
Next
ReDim $a_listViewItems[1]
$a_listViewItems[0] = ""
; la liste a été vidée alors
; on vide également l'ancien tableau des processus
ReDim $a_listeProcessus[1][1]
$a_listeProcessus[0][0] = 0
ReDim $a_listeProcessus[1][10]
EndFunc ;==>supprimeTousLesElementsDansListe
; // // // // // // // // // // // // // // // // // // // // //
; //
; //
; // >>> fonction qui semble poser problème
; //
; //
; // // // // // // // // // // // // // // // // // // // // //
Func trieListe()
Local $ordreTrie
If $indexColonne <> -1 Then
$ordreTrie = _GUICtrlHeader_GetItemFormat(_GUICtrlListView_GetHeader($hListView), $indexColonne)
If BitAND($ordreTrie, $HDF_SORTUP) Then
$ordreTrie = False
Else
$ordreTrie = True
EndIf
_GUICtrlListView_SimpleSort($hListView, $ordreTrie, $indexColonne)
EndIf
EndFunc ;==>trieListe
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iCode, $iIDFrom, $tNMHDR, $hWndListView, $tInfo, $index, $indexListe
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
Switch $hWndFrom
; ListView
Case $hWndListView
Switch $iCode
Case $LVN_COLUMNCLICK
;
; clic sur une colonne de la liste
;
; http://msdn.microsoft.com/en-us/library ... #40;VS.85).aspx
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
$indexColonne = DllStructGetData($tInfo, "SubItem")
_GUICtrlListView_SortItems($hListView, $indexColonne) ; trie la liste
EndSwitch
EndSwitch
$actionEnCours = False
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func quitte()
_GUICtrlListView_UnRegisterSortCallBack($hListView)
GUIDelete()
Exit
EndFunc ;==>quitte