Показать сообщение отдельно
  #1  
Старый 21.06.2009, 17:04
warner warner вне форума
Прохожий
 
Регистрация: 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;
Ответить с цитированием