|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
SysListView32 чужого приложения
Доброго времени суток.
Такая проблема: Нужно в таблице ЛистВью в окне чужого приложения поочередно установить фокус на некоторые заранее определенные элементы списка и нажать ENTER. Номера строк беруться из СтрингГрид в моем приложении. Использую ниже приложенный код. При запуске из Делфи все работает как надо, но когда запускаю ехе-файл и пытаюсь сделать то-же самое, окно чужого приложения закрывается без каких либо сообщений об ошибке. Подскажите, в чем моя ошибка? Код такой: Код:
const LVM_GETITEMCOUNT=$1000+4; LVM_SETITEMPOSITION=$1000+15; var pid: DWORD; hProcess: THandle; addr: Pointer; n, pos, s, k: integer; Dummy: DWORD; PItem: ^LV_ITEM; Item: LV_ITEM; begin GetWindowThreadProcessID(h,@pid); //h-определенно заранее hProcess:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,false,pid); addr:=VirtualAllocEx(hProcess,nil,4096,MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE); n:=SendMessage(h,LVM_GETITEMCOUNT,0,0); Pos := 0; s:=0; repeat Item.stateMask := LVIS_SELECTED or LVIS_FOCUSED; Item.state := LVIS_SELECTED or LVIS_FOCUSED; WriteProcessMemory(hProcess, PItem, @Item, SizeOf(LV_ITEM), Dummy); //окно закрывается при выполнении следующей строки SendMessage(h, LVM_SETITEMSTATE, WPARAM(StrToInt(sg.Cells[0, pos])), LPARAM(PItem)); //выбрать эл-т с индексом sg.Cells[0, pos] //нажать ентер Sleep(100); PostMessage(h,WM_KEYDOWN,VK_RETURN,0); Sleep(30); PostMessage(h,WM_KEYUP,VK_RETURN,1); Sleep(100); //снять выделение for k:=0 to n-1 do begin WriteProcessMemory(hProcess, PItem, @Item, sizeof(LV_ITEM), Dummy); SendMessage(h, LVM_SETITEMSTATE, WPARAM(k), LPARAM(PItem)); end; inc(Pos); inc(S); sleep(100); until (S>17) or (Pos=n) or (Pos=sg.RowCount); end; Последний раз редактировалось warner, 21.06.2009 в 17:20. |