CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Komunikacja pomiędzy programami

Komunikacja pomiędzy programami

dział ogólny

Re: Komunikacja pomiędzy programami

Nowy postprzez Cyfrowy Baron » sobota, 11 września 2010, 16:45

Niczemu. :) Chciałem pokazać, że w pewnym momencie pisaliśmy niemal o tym samym...
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: Komunikacja pomiędzy programami

Nowy postprzez politech » sobota, 11 września 2010, 18:20

coś więcej o problemie: jest to klient gry normalny plik typu exe nie mam pojęcia o jego stronie technicznej i prawdopodobnie nie istnieją nigdzie informacje o tym jak dziala ten program i co przyjmuje. Program ma miejsce na dane wpisywane z klawiatury log i pas, które chciałbym wypełnić(nic więcej "tylko" wypełnić te miejsca odpowiednimi danymi)
Oczywiście moj program ma uruchomić tego klienta najpierw
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Re: Komunikacja pomiędzy programami

Nowy postprzez polymorphism » sobota, 11 września 2010, 18:44

Jeśli są to typowe kontrolki, to przeszukujesz wszystkie aktywne okna aplikacji (EnumChildWindows). Tekst ustawiasz komunikatem WM_PASTE. Oczywiście wpierw musisz wklejany tekst wstawić do schowka (klasa TClipboard).
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: Komunikacja pomiędzy programami

Nowy postprzez Cyfrowy Baron » sobota, 11 września 2010, 19:25

Do tego dodam, że możesz to zrobić za pomocą funkcji SendMessage z wykorzystaniem komunikatu WM_PASTE jak podał polymorphism, ale można również symulować wciśnięcie konkretnego klawisza. By to jednak zrobić musisz pobrać uchwyt do kontrolek, do których chcesz wprowadzić tekst. Najpierw musisz jednak pobrać uchwyt do okna tego programu, potem do tych kontrolek. Problem może pojawić się, gdy te kontrolki znajdują się np. na obiekcie typu Panel, lub innym podobnym, gdyż wtedy konieczne może okazać się pobranie najpierw uchwytu do okna, potem do tego obiektu typu Panel a potem dopiero do kontrolki. By pobrać uchwyt do kontrolki musisz znać nazwę jej klasy. Możesz to sprawdzić za pomocą programu WinID.

Dokładniej opisuję tą metodę w serwisie Cyfrowy Baron w dziale: teoria -> Sterowanie obcym programem z poziomu własnego poprzez wysyłanie komunikatów.

Jeżeli okno tego programu bazuje na DirectX to może być z tym problem.
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: Komunikacja pomiędzy programami

Nowy postprzez politech » sobota, 9 października 2010, 22:23

Siedziałem ostatnio nad tym problem i tak: okno do programu uzyskuje poprawne po czym nie jestem w stanie znalezc okna do kontrolek(tzn. do buttonu, ktory nalezy wcisnać, button ten jest buttonem graficznym nie standardowym). Kod szukania wygląda tak:

KOD cpp:     UKRYJ  
HWND hWin = FindWindow ("tytulklasy", 0);
if (hWin > 0) { HWND hText = FindWindowEx (hWin, 0, 0, 0);
SendMessage (hText, WM_LBUTTONDOWN, 0, 0);
SendMessage (hText, WM_LBUTTONUP, 0, 0); }

gdzie wyszukwianie kontrolki realizowane bylo za pomocą różnych wersji:

KOD cpp:     UKRYJ  
HWND hText = FindWindowEx (hWin, 0, 0, 0);
HWND hText = FindWindowEx (hWin, 0, "tytulklasy", "tytulbuttona");
HWND hText = FindWindowEx (hWin, 0, "tytulklasy", 0);

Pozatym program WinId pokazuje mi ten sam tytul wszystkich buttonow jak i rowniez calego okna programu, do ktorego chce sie dostac
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Re: Komunikacja pomiędzy programami

Nowy postprzez Cyfrowy Baron » sobota, 9 października 2010, 22:50

button ten jest buttonem graficznym nie standardowym)


Więc nie ma możliwości uzyskania do niego dostępu, skoro nie jest to element interfejsu API. Ostatnio mam podobny problem z przeglądarką Firefox, o ile mogę pobrać uchwyt do okna, o tyle nie mogę uchwycić żadnej kontrolki gdyż nie są to elementy API.
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: Komunikacja pomiędzy programami

Nowy postprzez politech » niedziela, 10 października 2010, 16:37

Nie ma żadnej innej możliwości obejścia tego probelmu? Myślałem nad symulacją klawiatury ale nie da sie zap omoca klawiatury poruszac ani uzywac buttonow z menu więc chyba odpada. Zasymulwoanie myszki rownież jest niedopuszczale ze wzgledu na problemy przy zmianie rozdzielczosci czy rozne inne problemy. Macie jakieś pomysły?
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Symulacja kliknięcia lewym przyciskiem myszy.

Nowy postprzez Cyfrowy Baron » niedziela, 10 października 2010, 17:24

[j]Widzę dwie możliwości. Po pierwsze mając uchwyt do okna można wysłać konkretny komunikat, ale trzeba by wiedzieć o jaki typ komunikatu chodzi i jaką ma wartość. Gdyby posłużyć się jakimś programem, który potrafi przechwytywać komunikaty wysyłane z aplikacji do systemu i pokazuje jakie to są komunikaty, to można by je namierzyć i potem wysłać do okna konkretny komunikat.
Inny sposób to symulacja wciśnięcia klawisza myszy. Taka symulacja wymaga podania współrzędnych względem lewego górnego rogu ekranu. Pozycję okna względem ekranu można pobrać za pomocą funkcji [b]GetWindowRect(HWND hWnd, TRect &Rect)[/b]. Trzeba przywołać okno na pierwszy plan, potem do pozycji okna względem ekranu należy dodać pozycję przycisku względem okna programu. Następnie trzeba przesunąć kursor w wyliczoną pozycję i dokonać symulacji wciśnięcia lewego przycisku myszy.

Pokaże to na przykładzie okna programu Firefox oraz jego przycisku wstecz, który w przy rozdzielczości 1280x1024 znajduje się w pozycji do okna: left = 20, top = 60.[/j]

KOD cpp:     UKRYJ  
void BringWindowToFront(HWND hWnd)
{
 bool Result;
 DWORD ForegroundWindowThreadID;
 DWORD WindowThreadID;
 if(hWnd != GetForegroundWindow())
 {
  ForegroundWindowThreadID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
  WindowThreadID = GetWindowThreadProcessId(hWnd, NULL);
  if(ForegroundWindowThreadID != WindowThreadID)
  {
   AttachThreadInput(ForegroundWindowThreadID, WindowThreadID, true);
   SetForegroundWindow(hWnd);
   AttachThreadInput(ForegroundWindowThreadID, WindowThreadID, false);
  }
  else
   SetForegroundWindow(hWnd);
}
 }//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HWND hWnd = FindWindow(L"MozillaUIWindowClass", NULL);

 if(hWnd == NULL)
 {
  ShowMessage("Nie odnaleziono okna programu");
  return;
 }

 TRect wRect;
 GetWindowRect(hWnd, &wRect);

 BringWindowToFront(hWnd);

 POINT cP;
 GetCursorPos(&cP);

 int dx = wRect.Left + 20;
 int dy = wRect.Top + 66;

 SetCursorPos(dx, dy);


  <span class="posthilit">mouse_event</span>( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  <span class="posthilit">mouse_event</span>( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );

 Sleep(100);

 SetCursorPos(cP.x, cP.y);
 BringWindowToFront(this->Handle);
}


Tyle na razie udało mi się wymyślić.
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

Poprzednia strona

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