Я пытался получить текст элементов в просмотре списка другим процессом.Я нашел потрясающий учебник по CodeProject .Благодаря этой статье я смог сделать это на x32.Но при попытке запуска на x64 происходит сбой приложения, к которому я пытаюсь получить доступ, когда вызывается SendMessage.В комментариях к статьям у людей были одинаковые проблемы из-за разного размера указателя.Некоторые люди предложили использовать компилятор x64, который я не могу использовать.Мне нужно, чтобы моя программа работала на x32 / x64.Один парень предложил:
У меня есть ответ.Структура LVITEM неверна в 64-битных системах.Указатели теперь 64-битные, поэтому за указателем текста должно следовать фиктивное значение, чтобы корректно сместить элемент длины.
Я думаю, что это будет лучшим решением, так как я могу его запуститьдля х32 и х64 с одним exe.Я просто понятия не имею, как делать то, о чем он говорит.Я включил мой код, который в настоящее время работает на x32.Если кто-нибудь может мне помочь.Это было бы здорово.
LVITEMLVITEM lvi, *_lvi;
char item[512];
char *_item;
unsigned long pid;
HANDLE process;
GetWindowThreadProcessId(procList, &pid);
process = OpenProcess(0x001f0fff, FALSE, pid);
_lvi = (LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), 0x1000, 4);
_item = (char*)VirtualAllocEx(process, NULL, 512, 0x1000, 4);
lvi.cchTextMax = 512;
int r, c;
for (r = 0; r < rowCount; r++)
{
for (c = 0; c < columnCount; c++)
{
lvi.iSubItem = c;
lvi.pszText =_item;
// Insert lvi into programs's memory
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
// Have program write text to in its memory where we told it to
SendMessage(procList, LVM_GETITEMTEXT, (WPARAM)r, (LPARAM)_lvi);
// Get TVITEM back from programs
ReadProcessMemory(process, _item, item, 512, NULL);
}
}
// Clean up the mess we made
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
CloseHandle(process);