jak znaleźć HWND kiedy znamy tylko processID

dział ogólny

jak znaleźć HWND kiedy znamy tylko processID

Nowy postprzez zeno32167 » piÄ…tek, 21 listopada 2008, 17:39

Troche kodu z barona + 2 moje linijki

Kod: Zaznacz cały

bool CALLBACK EnumWindowsProc(HWND hWnd, TListView *ListView)
{
char WindowName[80], ClassName[80];

GetWindowText(hWnd, WindowName, 80);
GetClassName(hWnd,ClassName, 80);
AnsiString CLIENT = "CLIENT" ; 
DWORD procesID ;
GetWindowThreadProcessId(hWnd, &procesID);

if(ClassName==CLIENT)
{
ListView->Items->Add();
int i = ListView->Items->Count-1;
ListView->Items->Item[i]->Caption = AnsiString(WindowName);
ListView->Items->Item[i]->SubItems->Add(AnsiString(ClassName));
ListView->Items->Item[i]->SubItems->Add(procesID);
ListView->Items->Item[i]->Update();
}
return true;
}



jak widać procesID jest liczbą i tylko to różni nazwy moich okien, wszystkie się nazywają: SRO_Client
malo tego klasy też mają taką samą nazwę: CLIENT


jedyna rzecz która pozwoli mi to rozróżnić to ten processID bo dla każdego okna jest inny, tutaj mały screen:
Obrazek

i teraz główny problem, czy da się mając sam processID znaleźć HWND właśnie do tego okna z tym ID a nie innego?

koliduje mi to bo np jak chce wysłać SendMessage do okna to wiadomość idzie do pierwszego lepszego okna.

oczywiście pomyślałem o tym że można byloby zmienić nazwę okna ale do tego też potrzebuje rozróżnić nazwe okna,

i tak na przykład w tym kodzie znów zmienia mi losowe okno, oczywiscie mozna pozmieniac najpierw wszystkie okna na obojetnie jakie nazwy(aby kazda nazwa się roznila od drugiej), i potem juz te rozne nazwy pozmieniam sobie tak jak ja tego chce(nie bedzie losowego wybierania jak na poczatku, bo bede widzial rozne nazwy okien), ale to zabawy wtedy bedzie duzo

Kod: Zaznacz cały
HWND hWnd = FindWindow(NULL, "SRO_Client");

   SetWindowText(hWnd, "lalala");


z processID byłoby owiele łatwiej, no i ponowie pytanie, czy da się uzyskać hwnd do okna mając tylko i wyłącznie processID tego okna?

dzięki za pomoc
Avatar użytkownika
zeno32167
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 30 sierpnia 2008, 17:15
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: jak znaleźć HWND kiedy znamy tylko processID

Nowy postprzez Cyfrowy Baron » piÄ…tek, 21 listopada 2008, 18:53

Mając tylko PID procesu nie masz uchwytu do okna tego procesu, ale można posłużyć się wyszukiwaniem i w ten sposób pobrać uchwyt do takiego okna w oparciu o PID procesu:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
HWND HwndPID(DWORD dwPID)
{
HWND Hwnd = GetTopWindow(0);
HWND hWnd = 0;;
DWORD pid;

while(Hwnd)
{
  GetWindowThreadProcessId(Hwnd, &pid);
  if(pid == dwPID) hWnd = Hwnd;
  Hwnd = GetNextWindow(Hwnd, GW_HWNDNEXT);
}

return hWnd;
}
//-------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hWnd = HwndPID(2604);
}
//---------------------------------------------------------------------------


W celu sprawdzenia czy to działa, uruchom Notatnik systemowy, sprawdź w Menadżerze zadań jaki ma numer procesu, a następnie sprawdź nazwę okna korzystając z takiego oto kodu:
Kod: Zaznacz cały
//---------------------------------------------------------------------------
HWND HwndPID(DWORD dwPID)
{
HWND Hwnd = GetTopWindow(0);
HWND hWnd = 0;;
DWORD pid;

while(Hwnd)
{
  GetWindowThreadProcessId(Hwnd, &pid);
  if(pid == dwPID) hWnd = Hwnd;
  Hwnd = GetNextWindow(Hwnd, GW_HWNDNEXT);
}

   return hWnd;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   HWND hWnd = HwndPID(2604);
   char szTitle[256];
   GetWindowText(hWnd, szTitle, 256);
  Edit1->Textn = szTitle;
}
//---------------------------------------------------------------------------


Jeżeli wszystko zrobiłeś prawidłowo, to w Edit1 powinien ukazać się tekst Bez tytułu - Notatnik.

To zadziała oczywiście tylko w odniesieniu do samodzielnych procesów, czyli tylko takich, które nie są podłączone do innych procesów, dlatego to się sprawdza w przypadku prostych programów takich jak Notatnik, ale w przypadku programów, które uruchamiają własne dodatkowe procesy, może się to nie sprawdzić, gdyż te dodatkowe procesy mają ten sam PID, a funkcja wyszukująca sprawdza numery procesów i przypisuje sobie uchwyt do ostatniego napotkanego, przez co nie zawsze musi to być uchwyt akurat do tego okna do którego oczekujesz. Tak to już jest, gdy automatyzuje działania, trzeba precyzyjnie określać zadania. Masz już jednak jakiś punkt wyjścia...
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
    NieznanyNieznana


  • 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 49 gości

cron