Форум по 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.
Ответить с цитированием
  #2  
Старый 21.06.2009, 18:05
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Процедура нажатия кнопки <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  
Старый 21.06.2009, 18:27
warner warner вне форума
Прохожий
 
Регистрация: 21.06.2009
Сообщения: 4
Репутация: 10
По умолчанию

Спасибо, именно то что нужно
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

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