Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #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;

Последний раз редактировалось warner, 21.06.2009 в 17:20.
Ответить с цитированием
 



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram