Я предоставляю здесь код, который должен соответствовать вашим требованиям. Я работаю над библиотекой функций GUI, и только что завершил работу над некоторыми функциями ListBox, включая JEE_ListBoxInvSel(hCtl)
.
Вот пример кода с приведенными ниже функциями. Я проверил все достаточно тщательно. Оставьте комментарий если возникнут какие-либо проблемы.
^q::
ControlGet, hCtl, Hwnd, , ListBox1, A
vList = 1,3,7
JEE_ListBoxSetSel(hCtl, vList, "ds")
Sleep 2000
MsgBox % JEE_ListBoxGetSel(hCtl)
Sleep 2000
JEE_ListBoxInvSel(hCtl)
Sleep 2000
JEE_ListBoxInvSel(hCtl)
Sleep 2000
JEE_ListBoxInvSel(hCtl)
Sleep 2000
MsgBox done
Return
;==================================================
;selected GUI functions by jeeswg
;JEE_ListBoxInvertSelection
;JEE_ListBoxSetSelInv
JEE_ListBoxInvSel(hCtl)
{
SendMessage, 0x18B, , , , ahk_id %hCtl% ;LB_GETCOUNT
vCount := ErrorLevel
SendMessage, 0x190, , , , ahk_id %hCtl% ;LB_GETSELCOUNT
vCountSel := ErrorLevel
if (vCount-vCountSel > vCountSel)
vList := JEE_ListBoxGetSel(hCtl, 1), JEE_ListBoxSetSel(hCtl, vList, "sd")
else
vList := JEE_ListBoxGetSel(hCtl, 0), JEE_ListBoxSetSel(hCtl, vList, "ds")
Return
}
;==================================================
;returns 1-based index of focused item
JEE_ListBoxGetFocus(hCtl)
{
;LB_GETCARETINDEX := 0x19F
SendMessage, 0x19F, , , , ahk_id %hCtl% ;LB_GETCARETINDEX
Return ErrorLevel+1
}
;sets 1-based index of focused item
JEE_ListBoxSetFocus(hCtl, vNum, vOpt=0)
{
;LB_SETCARETINDEX := 0x19E
SendMessage, 0x19E, vNum-1, 0, , ahk_id %hCtl% ;LB_SETCARETINDEX
Return
}
;==================================================
;returns a comma-separated list of 1-based indexes for selected items
;JEE_ListBoxGetSelectedItems
JEE_ListBoxGetSel(hCtl, vOpt=1)
{
;LB_GETCOUNT := 0x18B
;LB_GETSELCOUNT := 0x190
;LB_GETSELITEMS := 0x191
SendMessage, 0x190, , , , ahk_id %hCtl% ;LB_GETSELCOUNT
vCountSel := ErrorLevel
VarSetCapacity(vBuf, 32*vCountSel)
SendMessage, 0x191, vCountSel, &vBuf, , ahk_id %hCtl% ;LB_GETSELITEMS
vRet := ErrorLevel
Loop, %vRet%
vOutput .= (NumGet(vBuf, A_Index*4-4, "UInt")+1) ","
vOutput := SubStr(vOutput, 1, -1) ;trim right
if (vOpt = 0)
{
SendMessage, 0x18B, , , , ahk_id %hCtl% ;LB_GETCOUNT
vCount := ErrorLevel
Loop, %vCount%
if A_Index not in %vOutput%
vOutput2 .= A_Index ","
vOutput2 := SubStr(vOutput2, 1, -1) ;trim right
Return vOutput2
}
Return vOutput
}
;==================================================
;description:
;hCtl: handle to ListBox control
;vList: comma-separated list of items (1-based index)
;e.g. '1,3,5' (select the 1st,3rd,5th items)
;e.g. '3' (select the 3rd item)
;vOpt: s/d/sd/ds/sa/da
;s select items in list
;d deselect items in list
;sd select all items and deselect items in list
;ds deselect all items and select items in list
;sa select all items
;da deselect all items
;JEE_ListBoxSelectItems
JEE_ListBoxSetSel(hCtl, vList, vOpt="s")
{
;LB_SETSEL := 0x185
if vOpt in sa,sd
SendMessage, 0x185, 1, -1, , ahk_id %hCtl% ;LB_SETSEL
if vOpt in da,ds
SendMessage, 0x185, 0, -1, , ahk_id %hCtl% ;LB_SETSEL
if vOpt in sa,da
Return
if vOpt in s,ds
vState := 1
if vOpt in d,sd
vState := 0
Loop, Parse, vList, `,
SendMessage, 0x185, vState, A_LoopField-1, , ahk_id %hCtl% ;LB_SETSEL
Return
}
;==================================================
почему вы используете 'PostMessage' (инструмент для редактирования любого окна, даже за пределы АКА) вместо' GuiControl' (инструмент для редактирования элементов графического интерфейса текущих АКА GUI)? – Blauhirn
Прокрутите все элементы и проверьте, выбран ли элемент. –