Delphi сохраняет проверенную информацию в объекте TCheckListBoxDataWrapper
. Указатель на этот объект хранится в обычном «элементе данных» элемента флажка. Затем этот объект имеет логическое свойство State
, которое вы найдете по смещению 8.
Примечание. Если выясняется, что в конкретной версии Delphi вашей программы оно имеет смещение, отличное от 8 , попробуйте что-нибудь поблизости - 4, 12, ... - это не зашло далеко ...
Чтобы узнать, отмечен ли пункт, вам нужно:
- Получить указатель на
TCheckListBoxDataWrapper
этого предмета. Это можно сделать, отправив сообщение LB_GETITEMDATA
. Если вы вернете ноль назад, он также будет считаться не проверенным. - Поскольку этот указатель указывает на память в другом процессе, а не на ваш, вы не можете просто разыменовать его. Вместо этого вам нужно будет использовать
ReadProcessMemory
. Зная, что свойство State
имеет смещение 8, вы можете вызвать ReadProcessMemory(hProcess, itemData + 8, &checked, 1, NULL)
, чтобы прочитать 1 байт в переменную checked
. (Сначала нужно открыть целевой процесс, используя OpenProcess
.)
Тогда вы получите проверенное состояние элемента в checked
! 1
для проверенного, 0
для непроверенного.
В случае, если вам позже потребуется также получить доступ к какому-либо другому внутреннему состоянию, еще один совет: есть свойство окна ControlOfsXXXXXXXXYYYYYYYY
с X
HINSTANCE
(базовый адрес) владельца окна (обычно 00400000
) и Y
- (шестнадцатеричный) идентификатор потока владельца окна (вы можете использовать GetWindowThreadProcessId
для его получения). Вы можете использовать GetProp
, чтобы получить значение этого свойства, которое будет указателем на управляющий объект (в этом примере - TCheckListBox
). Затем вы можете поэкспериментировать с ReadProcessMemory
, чтобы получить другие данные по мере необходимости. Вам нужно знать о смещениях (но вы можете использовать отладчик, чтобы попытаться выяснить их). Очень полезно скомпилировать тестовую программу с той же версией Delphi и выполнить там функции, которые обращаются к этим свойствам, тогда вы можете вместо этого отладить свою собственную тестовую программу и легче определить смещения.
Еще Продвинутый метод, который включает в себя вставку пользовательской библиотеки DLL (записанной в той же версии Delphi) в целевой процесс, позволяет более непосредственно получать доступ к данным (чтение и запись). Я написал статью об этом долгое время go.