![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток.
Такая проблема: Нужно в таблице ЛистВью в окне чужого приложения поочередно установить фокус на некоторые заранее определенные элементы списка и нажать 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
|
|||
|
|||
|
Спасибо, именно то что нужно
|