|
|
Регистрация | << Правила форума >> | 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. |
#2
|
|||
|
|||
Процедура нажатия кнопки <Enter> на пункте с индексом N объекта класса SysListView32:
Код:
procedure SelectAndEnterItemN(LVHandle: HWND; N: Integer); var hProcess: THandle; dwProcessID: DWORD; dwBytesWriten: DWORD; plviRemoteLVItem: PLVItem; lviRemoteLVItem: LV_ITEM; begin if LVHandle = 0 then Exit; dwProcessID := 0; GetWindowThreadProcessId(LVHandle, @dwProcessID); if dwProcessID = 0 then Exit; hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID); if hProcess = 0 then Exit; plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then Exit; ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM)); with lviRemoteLVItem do begin mask := LVIF_STATE; iItem := N; state := LVIS_FOCUSED or LVIS_SELECTED; stateMask := LVIS_FOCUSED or LVIS_SELECTED; end; if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem, SizeOf(LV_ITEM), dwBytesWriten) then Exit; SendMessage(LVHandle, LVM_SETITEM, 0, Integer(plviRemoteLVItem)); PostMessage(LVHandle, WM_KEYDOWN, VK_RETURN, 0); VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE); CloseHandle(hProcess); end; В вашем случае вызов этой процедуры должен выглядеть так: Код:
SelectAndEnterItemN(h, StrToInt(sg.Cells[0, pos])); |
#3
|
|||
|
|||
Спасибо, именно то что нужно
|