FindWindowEx() i Edit

dział ogólny

FindWindowEx() i Edit

Nowy postprzez duf » czwartek, 9 października 2008, 13:10

Przeczytałem artykuł "Sterowanie obcym programem z poziomu własnego poprzez wysyłanie komunikatów" i mam pytanie odnośnie funkcji FindWindowEx() . Co zrobić w przypadku dwóch komponentów Edit. Funkcja nie wie do którego Edita chcemy wpisać literkę. Class i Title komponentu Edit maja takie same nazwy.
Kod: Zaznacz cały
if( h > 0 )  h2 = FindWindowEx( h, 0, "Edit", "" );
SendMessage( h2, WM_CHAR, 'A', 1 );


I jeszcze jedno pytanie. Czy do rozwinięcia ComboBox`a należy użyć komunikatu CB_SHOWDROPDOWN
Kod: Zaznacz cały
if( h > 0 ) h2 = FindWindowEx( h, 0, "ComboBox", "" );
SendMessage( h2, CB_SHOWDROPDOWN, Integer(true), 0 );

Pytam bo nie mogę rozwinąć tym poleceniem ComboBox`a
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » czwartek, 9 października 2008, 13:34

Najpierw na drugie pytanie, jeżeli chodzi o ComboBox to rzeczywiście używa się definicji CB_SHOWDROPDOWN - taka ciekawostka: CB_ poprzedzające nazwę definicji pochodzi od pełnej nazwy Cyfrowy Baron. :D



Co do pierwszego pytania, to żeby je rozróżnić trzeba by czytać bezpośrednio ze stosu pamięci i odwoływać się do jej rejestrów, co jest niezwykle skomplikowane i nie działa w sposób uniwersalny, czyli nie można stworzyć kodu, który się sprawdzi w każdej aplikacji.
Jeżeli te pola Edit zawierają jakieś wartości - tekst - to można je właśnie rozróżnić poprzez ten tekst, jest on po prostu nazwą obiektu:

if( h > 0 ) h2 = FindWindowEx( h, 0, "nazwa klasy", "nazwa obiektu" ); // gdzie - nazwa obiektu - dla Edit o zawartość tego pola.
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

Re: FindWindowEx() i Edit

Nowy postprzez duf » czwartek, 9 października 2008, 13:44

WinID pokazuje różne wartości parametru HWND dla dwóch różnych Editów. Cz da się to wykorzystać do rozróżnienia Editów ?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » czwartek, 9 października 2008, 15:26

W przypadku WinID można by wykorzystać co najwyżej wartość określoną jako HWND, gdyby nie to, że jest ona przydzielana dynamicznie przez system każdej aplikacji w chwili uruchomienia, więc przy każdym uruchomieniu ta wartość jest inna. WinID prawdopodobnie pobiera to z pamięci procesu, aczkolwiek nie wiem jak to dokładnie jest, gdyż nigdy się aż tak nad tym nie zagłębiałem.
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

Re: FindWindowEx() i Edit

Nowy postprzez duf » czwartek, 9 października 2008, 15:51

Dziękuję.
W takim razie poszukuję dalej i natknałem sie na przypadek z WM_CONTEXTMENU. W tym przykładzie w chwili kiedy pojawia się menu kontekstowe program, który steruje notepadem jest niedostępny do chwili zamknięcia tego menu. To samo zauważyłem w innym przykłądzie, w którym to mój program uruchamia Button w innym programie, kóry to wywołuje okno modalne. Do chwili zamknięcia tego okna mój progrma zatrzymuje swoje działanie. W chwili zamknięcia wywołanego okna modalnego mój program wykonuje resztę kodu. Ta reszta kodu ma wpisywać w Edit okna modalnego treść. Za późno. Jak można dobrać się do tego modalnego okna ?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » czwartek, 9 października 2008, 16:41

Nie wiem czy dobrze Ciebie zrozumiałem, ale okno modalne ma już to do siebie, że wstrzymuje działania we wszystkich innych oknach do czasu zamknięcia okna modalnego. To element mechanizmu API systemu Windows, a nie programu i chyba nic z tym nie można zrobić.
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

Re: FindWindowEx() i Edit

Nowy postprzez duf » czwartek, 9 października 2008, 18:16

Oczywiście, nie ulega to wątpliwości. Ale jest jedno ale. Gdy uruchomię program z tym oknem modalnym, bezpośrednio poprzez dwukrotne wciśnięcie skrótu do tego programu to za pomocą mojego programu mogę wpisywać dane do Edita tego okna modalnego. Czyli mogę zmienić aktywność programów, raz będzie to mój program aktywny a następnie myszką uaktywnię ten drugi program. Ale gdy wywołam okno modalne tamtego programu za pomocą mojej aplikacji to już to nie jest tak oczywiste. Wrażenie jest takie jak gdyby okno modalne zapanowało nad tymi dwoma aplikacjami, swoja macierzystą i moja wywołującą. Rozsądek podpowiada ażeby moja aplikacja zrzekła się praw do tego obcego okna modalnego i działała samodzielnie. Tylko jak je rozłączyć ?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » czwartek, 9 października 2008, 18:42

Ale gdy wywołam okno modalne tamtego programu za pomocą mojej aplikacji


Tutaj tkwi klucz do rozwiązania problemu. Pytanie: jak wywołujesz to okno modalne? Podaj przykład kodu.
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

Re: FindWindowEx() i Edit

Nowy postprzez duf » piÄ…tek, 10 października 2008, 08:20

Kod: Zaznacz cały
void __fastcall TForm1::Button3Click(TObject *)
{
  int i = 0;
  string::iterator it;

  h = FindWindow( "FNWND390", 0 );

  if( h > 0 )  h2 = FindWindowEx( h, 0, "Button", "Plik do podpisu" );
  SendMessage( h2, WM_LBUTTONDOWN, 0, 1 );
  SendMessage( h2, WM_LBUTTONUP,   0, 1 );

                        // dotÄ…d wykonuje siÄ™ kod. Po otworzeniu okna modalnego poniższy kod
                        // "czeka" na zamkniÄ™cie okna modalnego. Tylko, że wtedy  jest on już bezużyteczny.

   h = FindWindow( "#32770", 0 ); // okno modalne

  if( h > 0 )  h2 = FindWindowEx( h, 0, "Edit", "" );
  string str = "20081009_287";
  for ( it = str.begin(); it < str.end(); it++ ) SendMessage( h2, WM_CHAR, str[i++], 1 );
}
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » piÄ…tek, 10 października 2008, 08:58

Problem polega na tym, że pobierając uchwyt pobierasz go najpierw do okna głównego aplikacji, potem wywołujesz okno modalne, które blokuje okno główne i blokuje w ten sposób Twój program. Rozwiązaniem być może jest zwolnienie uchwytu do okna głównego:

Kod: Zaznacz cały
    void __fastcall TForm1::Button3Click(TObject *)
    {
      int i = 0;
      string::iterator it;

      h = FindWindow( "FNWND390", 0 );

      if( h > 0 )  h2 = FindWindowEx( h, 0, "Button", "Plik do podpisu" );

      h = NULL;    <-- TUTAJ zwolnienie uchwytu

      SendMessage( h2, WM_LBUTTONDOWN, 0, 1 );
      SendMessage( h2, WM_LBUTTONUP,   0, 1 );

                            // dotÄ…d wykonuje siÄ™ kod. Po otworzeniu okna modalnego poniższy kod
                            // "czeka" na zamkniÄ™cie okna modalnego. Tylko, że wtedy  jest on już bezużyteczny.

       h = FindWindow( "#32770", 0 ); // okno modalne

      if( h > 0 )  h2 = FindWindowEx( h, 0, "Edit", "" );
      string str = "20081009_287";
      for ( it = str.begin(); it < str.end(); it++ ) SendMessage( h2, WM_CHAR, str[i++], 1 );
    }


aczkolwiek wątpię by to akurat zadziałało - trzeba sprawdzić, gdyż wciąż utrzymywany jest uchwyt do h2.
Trzeba by pokombinować z wątkami, w jednym wątku pobierasz uchwyt do okna głównego i uruchamiasz okno modalne, a w drugim masz dostęp do okna modalnego.
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

Re: FindWindowEx() i Edit

Nowy postprzez duf » piÄ…tek, 10 października 2008, 09:20

Dzięki,
Właśnie wczoraj w nocy przyszedł mi ten pomysł do głowy, mam na mysli wątki. Tylko mam obawy co do wykonania sie ich. Ale będę nad tym pracował.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Witold » piÄ…tek, 10 października 2008, 10:01

Spróbuj może zmienić:
Kod: Zaznacz cały
SendMessage( h2, WM_LBUTTONDOWN, 0, 1 );
SendMessage( h2, WM_LBUTTONUP,   0, 1 );

Na
Kod: Zaznacz cały

PostMessage( h2, WM_LBUTTONDOWN, 0, 1 );
PostMessage ( h2, WM_LBUTTONUP,   0, 1 );


Gdy okno modalne się otworzy, spróbuj znaleźć jego uchwyt.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » piÄ…tek, 10 października 2008, 12:20

Różnica między tymi funkcjami polega na tym, że SendMessage wysyła komunikat do uchwytu (HWND) i czeka na obsłużenie komunikatu, po czym zwraca rezultat, podczas gdy funkcja PostMessage umieszcza komunikat w kolejce komunikatów i natychmiast kończy swoje działanie.
W przypadku SendMessage mamy pewność, że komunikat zostanie wykonany - jeżeli jest to możliwe, lub nie - jeżeli pojawią się nieprzewidziane okoliczności, ale funkcja zawsze o tym powiadomi.
Funkcja PostMessage powiadamia tylko o wysłaniu komunikatu i umieszczeniu go w kolejce komunikatów jakie dochodzą do aplikacji, potem kończy działanie i nie sprawdza czy komunikat został wykonany. Ma to swoje wady, komunikat może czekać w kolejce w nieskończoność, może zostać pominięty i nigdy nie wykonany.
Niemniej jednak użycie funkcji PostMessage może rozwiązać Twój 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
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez duf » piÄ…tek, 10 października 2008, 13:25

I tak też się stało. Z pomocą funkcji Sleep() mój program otwiera okna innego programu zamyka je otwiera ponownie wpisuje dane itp. Cieszę się, że udało mi się rozwiązać ten problem bo przymierzałem się do niego od dawna. Faktycznie PostMessage() jest mniej odpowiedzialne za swoje czyny niemniej jednak można kontrolować wynik działania aplikacj i odpowiednio zareagować. Dziękuję za chęci i cenne informacje.
Ciekawą rzeczą jest to, że obcy program można otworzyć w formie niewidocznej i również wykonywać na nim operacje:
Kod: Zaznacz cały
ShellExecute( Handle, "open", "D:\\Program Files\\KontrolkaAX\\PodpisEXML\\digital_sign.exe", NULL, NULL, [b]SW_HIDE[/b]);

Szkoda tylko, że nie ma takiego komunikatu typu WM_. ;)
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: FindWindowEx() i Edit

Nowy postprzez Cyfrowy Baron » piÄ…tek, 10 października 2008, 14:13

Jeżeli chcesz wysłać komendę z SW_HIDE to musisz skorzystać z funkcji ShowWindow:

Kod: Zaznacz cały
  ShowWindow(hWnd, SW_HIDE);


► Specyfikacja funkcja ShowWindow 
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

Następna 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 7 gości

cron