[C++] odczyt textu z obcego okna

0

witam,

mam pewien problem, bowiem chciałbym z innej aplikacji odczytać tabelke (SysListView32) i wyświetlić ją w swojej aplikacji w C++ Builderze. I mam problem bo nie umię odczytać tego, wiem że trzeba użyć FindWindow i FindWindowEx aby znaleźć odpowiedni handler do wywowałania PostMessage, tylko teraz nie wiem jakie PostMessage uzyć bo WM_GETTEXT raczej nie działa. Czy mógłby ktoś mi pomóc.

0

Sprawdz sobie w pomocy (jesli masz Delphi to masz również WIN32SDK, a jak nie masz to na stronke Microsoftu wejdz) znaczenie i parametry dla poniżej podanych wiadomości. One służą do pobierania i dodawania składników List View.

Items and Subitems

LV_ITEM
LVM_DELETEALLITEMS
LVM_DELETEITEM
LVM_GETITEM
LVM_GETITEMCOUNT
LVM_GETITEMSPACING
LVM_GETITEMSTATE
LVM_GETITEMTEXT
LVM_GETSELECTEDCOUNT
LVM_INSERTITEM
LVM_SETITEM
LVM_SETITEMCOUNT
LVM_SETITEMSTATE
LVM_SETITEMTEXT 
0

ok dzięki za wskazówki bedę próbował :)
jak bede miał jakieś problemy napisze

0

to NIE jest nietuzinkowy temat - to są podstawy API!!

0

Oj, problem tu opisany nie jest wcale łatwy dla początkującego.
Zwyczajne SendMessage zazwyczaj wywali tamten program, bo LVITEM będzie w Twoim zakresie pamięci co może być kodem w tamtym programie (adres struktury)

  1. Process musisz otworzyć z prawem PROCESS_VM_OPERATION.
  2. Zaalokuj troszkę pamięci w obcym programie dla LVITEM + miejsce na stringi - VirtualAllocEx, otrzymany pointer podaj w SendMessage jako LVITEM*, potem odczytaj to co tamten program tam wpisał (ReadProcessMemory).

Pamiętaj o pointerach dla stringów: nie podawaj adresów buforów które należą do Twojego programu, tylko wolne miejsce w zaalokowanej virtualnej pamięci

// extra memory w obcym procesiel 4096 - standardowy rozmiar strony pamięci
LVITEM *premote = VirtualAllocEx(hProcess,0,4096,MEM_COMMIT,PAGE_READWRITE);
// standardowa struct, inicjowana tu, wpisana do procesu
LVITEM local;
local.mask = LVIF_TEXT;
local.iItem = ??;
local.iSubItem = ??;
local.pszText = premote + sizeof(LVITEM); // uwaga!
local.cchTextMax = 4096 - sizeof(LVITEM);

WriteProcessMemory(hProcess, premote, &local, sizeof(LVITEM), 0); // null zamiast zero, forum bug
SendMessage(hListView, LVM_GETITEM, 0, premote);

teraz możesz odczytać string z adresu premote + sizeof(LVITEM)

char blah[256];
ReadProcessMemory(hProcess, premote + sizeof(LVITEM), &blah, 255, 0);
blah[255] = 0;

Nie zapomnij też o VirtualFreeEx(hProcess,remote,4096,MEM_RELEASE);

1 użytkowników online, w tym zalogowanych: 0, gości: 1