CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - uchwyt po PID

uchwyt po PID

dział ogólny

uchwyt po PID

Nowy postprzez masnyk » piątek, 7 stycznia 2011, 16:37

witam
szukam jakiegoś uniwersalnego sposobu wyszukiwania hwnd do procesu, lub grupy procesow pomijajac estetyke kodu podam jego krytyczne fragmenty:

szukanie PIDów, na podstawie tutka z cyfrowego barona, listowanie aktywnych procesow

KOD cpp:     UKRYJ  
void *Snap;
 PROCESSENTRY32 proces;

 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0);
 proces.dwSize = sizeof(PROCESSENTRY32);

 if(Process32First(Snap , &proces)) {
  do {
  HWND h1 = FindWindow("Notepad", 0);
  if(proces.szExeFile[ 0 ] != '[')
     if (proces.szExeFile[0]=='n')
     if (proces.szExeFile[1]=='o')
     if (proces.szExeFile[2]=='t')
     if (proces.szExeFile[3]=='e'){
    //Zrzut do tablicy PIDa - proces.th32ProcessID
  }
}


ok mam tablice pidow - notatnikow
teraz zabieram sie za wyszukiwanie hwnd:


KOD cpp:     UKRYJ  
HWND h = ::GetTopWindow(0 );
while ( h ) {
  DWORD pid;
  DWORD dwTheardId = ::GetWindowThreadProcessId( h,&pid);
               
  if ( pid == StrToInt(ListBox1->Items->Strings[i]))
         {
              break; ///jest pid - jest uchwyt
         }
         h = ::GetNextWindow( h , GW_HWNDNEXT);
}
//tutaj mam h
 


i teraz zaczynają się jaja:

bo FindWindow daje mi inny uchwyt niż powyższa pętla

KOD cpp:     UKRYJ  
char buffer[256];
GetWindowText(h,buffer,255); //Daje mi MSCTFIME (WTF?!)

hh = FindWindow("notepad",NULL);
GetWindowText(hh,buffer,255); //Daje mi Bez tytułu... czyli jest OK
 


Aby uciąć od razu powiem, że robię przegląd dla wszystkich wyszukanych PIDów i nieważne ile mam notatników - zawsze jest tak samo źle.
co ciekawe...

KOD cpp:     UKRYJ  
SetForegroundWindow(h);
SetForegroundWindow(hh);
 


Powoduje ten sam efekt, mryga mi na pasku zadań

Jakiś pomysł - dlaczego tak? :))))
Ostatnio edytowano piątek, 7 stycznia 2011, 18:52 przez Cyfrowy Baron, łącznie edytowano 2 razy
Powód: Wewnątrz tagów CODE i CPP nie mozna stosować innych tagów.
Avatar użytkownika
masnyk
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): piątek, 7 stycznia 2011, 16:20
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows7
Kompilator: bcb6
Gadu Gadu: 0
    Windows 7Firefox

Re: uchwyt po PID

Nowy postprzez polymorphism » piątek, 7 stycznia 2011, 19:20

Nawiasem...
KOD cpp:     UKRYJ  
if(proces.szExeFile[ 0 ] != '[')
if (proces.szExeFile[0]=='n')
if (proces.szExeFile[1]=='o')
if (proces.szExeFile[2]=='t')
if (proces.szExeFile[3]=='e')
{
        //Zrzut do tablicy PIDa - proces.th32ProcessID
}

Co to za koszmarek?! :shock:

Tak sensowniej:
KOD cpp:     UKRYJ  
if(proces.szExeFile[ 0 ] != '[' && memcmp(proces.szExeFile, "note", 4) == 0)
{
        //Zrzut do tablicy PIDa - proces.th32ProcessID
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: uchwyt po PID

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 19:38

Nie podałeś tutaj poprawnego kodu, gdyż próbując zrobić program w oparciu o to co podałeś otrzymałem masę błędów. Przetestowałem to u siebie i to działa, lecz do każdego PID'a podpięte są dwa inne uchwyty, które mają odrębne numery ale ten sam PID. Być może w kodzie którego tutaj nie podałeś łapiesz tylko jeden z tych uchwytów.
notepad.png


KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 void *Snap;
 PROCESSENTRY32 proces;

 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0);
 proces.dwSize = sizeof(PROCESSENTRY32);

 if(Process32First(Snap , &proces))
 {
  do
  {
   if(proces.szExeFile[ 0 ] != '[' && !stricmp( proces.szExeFile, "notepad.exe") )
   {
    ListBox1->Items->Add( (String)proces.th32ProcessID );
   }
  }
  while(Process32Next(Snap , &proces));
 }


 HWND h = ::GetTopWindow(0 );
 do
 {
  DWORD pid;
  DWORD dwTheardId = ::GetWindowThreadProcessId(h, &pid);

  for(int i = 0; i < ListBox1->Items->Count; i++)
  {
   if( pid == StrToInt( ListBox1->Items->Strings[i] ) )
   {
    char buffer[256];
    GetWindowTextA(h, buffer, 255);

    if(GetWindowLongA(h, GWL_ID) > 0)
    {
     ListBox2->Items->Add( (String)pid + " - " + (String)buffer );
    }
   }
  }
  h = GetNextWindow(h , GW_HWNDNEXT);
 }while(h);
}


U mnie to działa. Patrz program w załączniku.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
masnyk
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: uchwyt po PID

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 19:43

Ten kod da się zoptymalizować:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 void *Snap;
 PROCESSENTRY32 proces;

 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0);
 proces.dwSize = sizeof(PROCESSENTRY32);

 if(Process32First(Snap , &proces))
 {
  do
  {
   if(proces.szExeFile[ 0 ] != '[' &&
      !_wcsicmp( proces.szExeFile, L"notepad.exe") )
   {
    ListBox1->Items->Add( (String)proces.th32ProcessID );
   }
  }
  while(Process32Next(Snap , &proces));
 }


 HWND h = ::GetTopWindow(0 );
 do
 {
  DWORD pid;
  DWORD dwTheardId = ::GetWindowThreadProcessId(h, &pid);

  int f = ListBox1->Items->IndexOf((String)pid);

  if(f >= 0 && GetWindowLongA(h, GWL_ID) > 0)
  {
   char buffer[256];
   GetWindowTextA(h, buffer, 255);

   ListBox2->Items->Add( (String)pid + " - " + (String)buffer );
  }

  h = GetNextWindow(h , GW_HWNDNEXT);
 }while( h );
}


Usunąłem pętlę for.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: uchwyt po PID

Nowy postprzez masnyk » piątek, 7 stycznia 2011, 20:03

kurcze, dzięki kod przeanalizuję dokładnie potem, ale powklejałem i jest ok

mój kod się nie kompilował bo nie był kompletny, wstawiłem elementy, które odpowiadały za opisywaną logikę
a co do koszmarków - wiem , wiem :) po prostu pisałem późno i zależało mi tylko za true albo false - z wlk. TODO do napisania tego w sposób sensowny ;)
myślę, że ten program może być bardzo przydatny bo pozwala na wyszukiwanie uchwytów w lepszy sposób niż FindWindow.
Przykładowo title okna często się zmienia - mój thunderbird otwiera się standardowo z titlem mój.email@ - odebrane (np.) i podawanie takiego titla do wyszukiwania jest zdradliwe, bo wystarczy poklikać w programie - i już title jest inny - więc myślę że idea szukania po PIDzie jest super

Wielkie dzięki !
Avatar użytkownika
masnyk
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): piątek, 7 stycznia 2011, 16:20
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows7
Kompilator: bcb6
Gadu Gadu: 0
    Windows 7Firefox

Re: uchwyt po PID

Nowy postprzez masnyk » piątek, 7 stycznia 2011, 20:04

i wywalić listbox - i zamienić wektorem albo jakimś arrayem :))) chodzi o ideę - pewnie można go dopieszczać jeszcze w kilku innych miejscach ;)

hwnd findprocess(AnsiString nazwa);

:geek: :geek:
Avatar użytkownika
masnyk
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): piątek, 7 stycznia 2011, 16:20
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows7
Kompilator: bcb6
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości