21.06.2009, 17:04
|
Прохожий
|
|
Регистрация: 21.06.2009
Сообщения: 4
Репутация: 10
|
|
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;
|