Avatar billede olsenit Praktikant
19. november 2006 - 01:56 Der er 13 kommentarer

syslistview32 (sendmessage?)

Hej.

Jeg vil gerne hente lidt informationer fra et andet win32 program ind i mit program.

Først får jeg HWND med FindWindow, og dernæst HWND på min SysListView32 med FindWindowEX - så langt så godt og dem finder jeg helt korrekt...

men derfra og få indholdet af denne, det kan jeg ikke klare - hvordan bærer jeg mig ad med dette?

På forhånd tak !
Avatar billede bertelbrander Praktikant
19. november 2006 - 02:13 #1
Har du prøvet at sende en LVM_GETITEM til den?
Avatar billede olsenit Praktikant
19. november 2006 - 02:15 #2
bertelbrander: Det kan man vidst ikke med syslistview32 så vidt jeg har forstået på adskillige tråde på nettet.
Avatar billede bertelbrander Praktikant
19. november 2006 - 02:40 #3
Det ville man vel gøre hvis det var en syslistview32 i ens egen app?

Jeg ved ikke om det vil virke hvis den ligger i en anden app.
Avatar billede olsenit Praktikant
19. november 2006 - 02:45 #4
Jeps, det er kun til ens eget program. Du skal læse fra det andet programs hukommelse direkte hvis det er et andet program og det kan jeg ikke hitte ud af.
Avatar billede bertelbrander Praktikant
19. november 2006 - 03:02 #5
ReadProcessMemory:
http://msdn2.microsoft.com/en-us/library/ms680553.aspx

men der er ikke specielt nemt at finde det man vil læse.
Jeg tror jeg har et eksempel et eller andet sted.
Avatar billede bertelbrander Praktikant
19. november 2006 - 03:14 #6
Det var hvad jeg kunne finde:
#include <iostream>
#include <windows.h>
#include <psapi.h>

using namespace std;

int main()
{
  DWORD ProcessId[1024], NumProcesses;
  EnumProcesses(ProcessId, 1024, &NumProcesses);
  DWORD counter;
  for(counter = 0; counter < NumProcesses; counter++)
  {

      HANDLE Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId[counter]);
      if(Proc)
      {
        char Buffer[1024];
        GetModuleBaseName(Proc, 0, Buffer, sizeof(Buffer));
        long Addr= 0x40000;
        long i = 0;
        SIZE_T BytesRead = 0;
        if(ReadProcessMemory(Proc, &Addr, &i, 4, &BytesRead))
        {
            cout << "Success: " << BytesRead << ", " << ProcessId[counter] << ", " << i << ", " << Buffer << endl;
        }
      }
  }
}

Det forsøger at læse 4 bytes fra adresse 0x40000 i alle processer.
Avatar billede bertelbrander Praktikant
19. november 2006 - 03:23 #7
Man kunne overveje om en hook der fanger LVM_SETITEM var en bedre måde?

Det må blive i morgen...
Avatar billede olsenit Praktikant
19. november 2006 - 04:41 #8
hehe det lyder interessant hvis man kan lave sådan noget bertelbrander :) håber du kan hjælpe mig.

forstår ikke helt hvad vi skal med 4 bytes fra 0x40000, beklager
Avatar billede bertelbrander Praktikant
19. november 2006 - 14:30 #9
Det var bare et eksempel, et svar på:
"Du skal læse fra det andet programs hukommelse direkte"
Avatar billede olsenit Praktikant
24. november 2006 - 06:18 #10
Jeg søger stadig en løsning - jeg har sgu ikke fundet ud af noget selv.
Avatar billede bertelbrander Praktikant
26. november 2006 - 20:29 #11
Jeg har lavet noget der delvist virker.
Det er ikke 100% stabilt! Så vær varsom når du kører det, det kan få tilfældige andre programmer til at gå ned:
http://damb.dk/zip/hook2.zip

Hvis jeg bygger med BorlandC++ kører det, der bliver skrevet til C:\log.txt når brugeren trykker på Refresh i det andet program.

Du skal lukke MyTest.exe inden other.exe.

Jeg har prøvet at bygge med gcc, men den kalder ikke DllMain og det virker derfor ikke.

Jeg vil prøve at se lidt mere på projektet de kommende dage.
Avatar billede olsenit Praktikant
21. december 2006 - 09:13 #12
Hej Bertelbrander. Du må meget gerne komme med en pris på fuldførelse af denne opgave - den er af stor betydning for mig !

Og jeg ser helst noget jeg kan kompilere i et frit udviklingsmiljø.

Håber du kan hjælpe mig, og vil gerne give en fornuftig pris.

VH Jørgen Olsen
Avatar billede bertelbrander Praktikant
21. december 2006 - 20:31 #13
Jeg havde helt glemt projektet, jeg kikker lidt mere på det de kommende dage.
Det kommer ikke til at koste noget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester