#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GuiListView.au3>
#include <SendMessage.au3>
$GUI = GUICreate('_GUICtrlListView_MoveItemsSelected', 300, 320)
$Up_Button = GUICtrlCreateButton("Up", 20, 20, 40, 24)
$Down_Button = GUICtrlCreateButton("Down", 70, 20, 40, 24)
$ListView = _GUICtrlListView_Create($GUI, "Column1|Column2", 20, 50, 260, 250, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT), $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($ListView, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
For $i = 0 To 9
_GUICtrlListView_AddItem($ListView, "Item " & $i + 1, Random(0, 2, 1))
_GUICtrlListView_AddSubItem($ListView, $i, "SubItem " & $i + 1, 1, Random(0, 2, 1))
Next
$iRandom_1 = Random(0, 9, 1)
$iRandom_2 = Random(0, 9, 1)
_GUICtrlListView_SetItemChecked($ListView, $iRandom_1, 1)
_GUICtrlListView_SetItemSelected($ListView, $iRandom_1, 1)
_GUICtrlListView_SetItemChecked($ListView, $iRandom_2, 1)
_GUICtrlListView_SetItemSelected($ListView, $iRandom_2, 1)
_SendMessage($ListView, $LVM_SETCOLUMNWIDTH, 0, -1)
_SendMessage($ListView, $LVM_SETCOLUMNWIDTH, 1, -1)
ControlFocus($GUI, "", $ListView)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Up_Button
_GUICtrlListView_MoveItemsSelected($ListView, -1)
ControlFocus($GUI, "", $ListView)
Case $Down_Button
_GUICtrlListView_MoveItemsSelected($ListView, 1)
ControlFocus($GUI, "", $ListView)
EndSwitch
WEnd
Func _GUICtrlListView_MoveItemsSelected($hListView, $iDirection)
Local $aSelected_Indices = _GUICtrlListView_GetSelectedIndices($hListView, 1)
If UBound($aSelected_Indices) < 2 Then Return SetError(1, 0, "")
If $iDirection <> 1 And $iDirection <> -1 Then Return SetError(2, 0, "")
Local $iTotal_Items = _GUICtrlListView_GetItemCount($hListView)
Local $iTotal_Columns = _GUICtrlListView_GetColumnCount($hListView)
Local $iUbound = UBound($aSelected_Indices)-1, $iNum = 1, $iStep = 1
Local $iCurrent_Index, $iUpDown_Index, $sCurrent_ItemText, $sUpDown_ItemText
Local $iCurrent_CheckedState, $iUpDown_CheckedState
Local $iImage_Current_Index, $iImage_UpDown_Index
If ($iDirection = -1 And $aSelected_Indices[1] = 0) Or _
($iDirection = 1 And $aSelected_Indices[$iUbound] = $iTotal_Items-1) Then Return SetError(3, 0, "")
ControlListView($hListView, "", "", "SelectClear")
If $iDirection = 1 Then
$iNum = $iUbound
$iUbound = 1
$iStep = -1
EndIf
For $i = $iNum To $iUbound Step $iStep
$iCurrent_Index = $aSelected_Indices[$i]
$iUpDown_Index = $aSelected_Indices[$i]+1
If $iDirection = -1 Then $iUpDown_Index = $aSelected_Indices[$i]-1
$iCurrent_CheckedState = _GUICtrlListView_GetItemChecked($hListView, $iCurrent_Index)
$iUpDown_CheckedState = _GUICtrlListView_GetItemChecked($hListView, $iUpDown_Index)
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index)
For $j = 0 To $iTotal_Columns-1
$sCurrent_ItemText = _GUICtrlListView_GetItemText($hListView, $iCurrent_Index, $j)
$sUpDown_ItemText = _GUICtrlListView_GetItemText($hListView, $iUpDown_Index, $j)
If _GUICtrlListView_GetImageList($hListView, 1) <> 0 Then
$iImage_Current_Index = _GUICtrlListView_GetItemImage($hListView, $iCurrent_Index, $j)
$iImage_UpDown_Index = _GUICtrlListView_GetItemImage($hListView, $iUpDown_Index, $j)
_GUICtrlListView_SetItemImage($hListView, $iCurrent_Index, $iImage_UpDown_Index, $j)
_GUICtrlListView_SetItemImage($hListView, $iUpDown_Index, $iImage_Current_Index, $j)
EndIf
_GUICtrlListView_SetItemText($hListView, $iUpDown_Index, $sCurrent_ItemText, $j)
_GUICtrlListView_SetItemText($hListView, $iCurrent_Index, $sUpDown_ItemText, $j)
Next
_GUICtrlListView_SetItemChecked($hListView, $iUpDown_Index, $iCurrent_CheckedState)
_GUICtrlListView_SetItemChecked($hListView, $iCurrent_Index, $iUpDown_CheckedState)
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index, 0)
Next
For $i = 1 To UBound($aSelected_Indices)-1
$iUpDown_Index = $aSelected_Indices[$i]+1
If $iDirection = -1 Then $iUpDown_Index = $aSelected_Indices[$i]-1
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index)
Next
Return 1
EndFunc