Tytuł klikniętego okna

dział ogólny

Tytuł klikniętego okna

Nowy postprzez Darek_C++ » Å›roda, 27 sierpnia 2008, 00:30

Czy da się pobrać tytuł okna w ramach którego wykonano kliknięcie ?
Pozdrawiam
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Tytuł klikniętego okna

Nowy postprzez Cyfrowy Baron » Å›roda, 27 sierpnia 2008, 10:48

Można pobrać tytuł każdego okna do któego mamy uchwyt za pomocą funkcji:

GetWindowText(HWND hWnd, char *Buf, size_BUf);

Pobieranie uchwytu do okna i odczytywanie jego nazwy musi odbywać się w jakimś zdarzeniu, np. OnTimer komponentu typu TTimer. Można by się pokusić o haki systemowe, ale to niepotrzebnie skomplikuje program. Można by to też realizować w wątku w nieskończonej pętli, ale ja pokaże jak to zrobić za pomocą zegara.



Ustawiamy właściwość Interwal zegara na jakąś niedużą np. 75, a właściwość Enabled na true.
Uchwyt do okna pobiera się poprzez funkcję WindowFromPoint, funkcji trzeba przekazać pozycję kursora, uchwyt do okna jest pobierany w oparciu właśnie o tą pozycję, ale tutaj pojawia się pewna niedogodność. Uchwyt do okna zostanie pobrany tylko jeżeli wskażemy na belkę tytułową lub bezpośrednio na formularz, jeżeli natomiast wskażemy jakiś obiekt na formularzu i będzie on posiadał nazwę (np. MainMenu) to zostanie pobrany uchwyt do tego obiektu i zostanie zwrócony tytuł tego obiektu.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HWND hWnd = WindowFromPoint(Mouse->CursorPos);

char Buf[80];
GetWindowText(hWnd, Buf, sizeof(Buf));
Edit1->Text = (String)Buf;
}
//---------------------------------------------------------------------------
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: Tytuł klikniętego okna

Nowy postprzez Darek_C++ » Å›roda, 27 sierpnia 2008, 18:59

Oczywiście działa, ale nie tak do końca jak bym chciał. Przykładowo otwieramy w outlooku nową wiadomość i jak kursor jest w polu do pisania treści lub na przeglądarkach IE/FF w części treści strony już informacja o oknie ginie :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Tytuł klikniętego okna

Nowy postprzez Cyfrowy Baron » Å›roda, 27 sierpnia 2008, 19:54

Jak widzę nie przeczytałeś mojej odpowiedzi dokładnie, a tam jest wyjaśnienie:

ale tutaj pojawia się pewna niedogodność. Uchwyt do okna zostanie pobrany tylko jeżeli wskażemy na belkę tytułową lub bezpośrednio na formularz, jeżeli natomiast wskażemy jakiś obiekt na formularzu i będzie on posiadał nazwę (np. MainMenu) to zostanie pobrany uchwyt do tego obiektu i zostanie zwrócony tytuł tego obiektu.


I nic Tobie na to nie poradzę. Uchwyt nie jest pobierany tylko do okna, ale do obiektów, które w tym oknie się znajdują. Tak to niestety już działa. Jak będę miał wolną chwile to przemyślę ten problem. Być może da się pobrać uchwyt do "rodzica" obiektu, ale i tutaj jest problem tego rodzaju, skąd program ma wiedzieć, że wskazuje na klasę okna, a nie na klasę obiektu w oknie.
Na chwilę obecną nie wiem jak odróżnić obiekt - okno od innych obiektów, gdyż każdy z obiektów posiada jakąś nazwę klasy.
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: Tytuł klikniętego okna

Nowy postprzez Cyfrowy Baron » piÄ…tek, 29 sierpnia 2008, 14:49

Rozwiązaniem dla Twojego problemu jest funkcja GetAncestor, która zwraca uchwyt do "przodka" obiektu przekazanego jako pierwszy argument tej funkcji:

Kod: Zaznacz cały
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   HWND hWnd = GetAncestor(WindowFromPoint(Mouse->CursorPos), GA_ROOTOWNER);

   char Buf[260];
   GetWindowText(hWnd, Buf, sizeof(Buf));
   Edit1->Text = (String)Buf;
}
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: Tytuł klikniętego okna

Nowy postprzez Darek_C++ » sobota, 30 sierpnia 2008, 21:35

Dziękuję za pomoc Cyfrowy Baronie ;
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana


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 8 gości

cron