Pokazywanie identyfikatorów komunikatów

0

Witam,
chciałbym napisać w C pierwszy program dla Windows, który miałby działać następująco:

  • pokaż okno;
  • do momentu zamknięcia okna wypisuj w nim (na bieżąco, jeden pod drugim) komunikaty (ich identyfikatory) trafiające do okna.

Spodziewam, się, że jak np. przesunę okienko, nacisnę jakiś klawisz lub przycisk myszy, to te różne nazwy komunikatów będą się dopisywać.
Czy jest to jakieś (nie wiadomo jakie) wyzwanie, bo przykładu nie udało mi się znaleźć?

0

Zadanie wygląda na całkiem proste, ale nie nader trywialne. Pochwal się wynikiem jak skończysz.

0
kq napisał(a):

Zadanie wygląda na całkiem proste, ale nie nader trywialne. Pochwal się wynikiem jak skończysz.

Czemu spodziewasz się, że nie jest trywialne?
Może i nie jest, bo nie udało mi się znaleźć gotowca.
I nie ukrywam, że jestem zdziwiony, bo to powinno być bardziej niż banalne.

1
Darek napisał(a):

Czy jest to jakieś (nie wiadomo jakie) wyzwanie, bo przykładu nie udało mi się znaleźć?

Sama chęć napisania tego programu w czystym Windows API jest wyzwaniem. ;)

Mam już za sobą pisanie czegoś podobnego, tyle że nie dla okna, a dla komponentu formatowalnej etykiety i nie w C/C++, a w Pascalu. Takiego programiku potrzebowałem do podglądania obsługi komunikatów i danych przez nie niesionych – kiedy kontrolka wykrywa ruch kursora, kiedy wciskania i puszczania klawiszy, podgląd współrzędnych kursora i kolejności odbieranych komunikatów itd.

IMO jeśli chodzi o identyfikatory komunikatów, to raczej nie znajdziesz w bibliotece standardowej gotowego mechanizmu do konwersji liczbowego ID na ciąg znaków. Tak więc będziesz musiał sobie napisać funkcję, która to wykona – zwykły switch wystarczy. Do ekstrahowania danych z lParam i wParam są gotowe funkcje.

Komunikaty standardowo łapiesz w głównej pętli i robisz z nimi co chcesz – filtrowanie na podstawie uchwytu, konwersja ID na nazwę, wypakowanie danych, wrzucenie ich ”gdzieś” (np. do listbox czy logu) itd. Nie powinieneś mieć z tym większych problemów.

Darek napisał(a):

Czemu spodziewasz się, że nie jest trywialne?
Może i nie jest, bo nie udało mi się znaleźć gotowca.

To że nie znalazłeś gotowca, wcale nie oznacza, że zadanie jest skomplikowane. To akurat nie jest.

0
MarekR22 napisał(a):

Nie sprawdzałem, ale czy nie chodzi coś o coś takiego:
https://docs.microsoft.com/en-us/windows/desktop/winauto/accessible-event-watcher
lub https://docs.microsoft.com/en-us/windows/desktop/winauto/inspect-objects

Dzięki, nie znałem i nie wiedziałem jak wygooglać.
Generalnie to tak, rzecz w tym, że:

  1. nie do końca rozumiem, które komunikaty to pokazuje (poklikałem, jeszcze nie przeczytałem);
  2. mnie interesuje klawiatura, mysz i operacje na oknie (przesuwanie, zmiana rozmiaru, minimalizowanie itd...) - te narzędzie jakoś nie wszystko to pokazują i jeszcze nie rozumiem dlaczego.
1

Robiłem coś takiego. Było dosyć proste.

Mała podpowiedź: stwórz program konsolowy. Otwórz okno. Komunikaty wyświetlaj w konsoli printfem, coby nie ingerować w samo okno.

0

Dzięki!
Mam jeszcze (zanim zacznę) pytanie:

  • czy (mając aktywne to utworzone okno) powinienem bez dodatkowych funkcji dostawać komunikaty o ruchach myszy/klawiatury i okna? Np. sam ruch myszy jest zdarzeniem? Czy dopiero np. wciśnięcie LPM?
1

To, co chcesz wygóglać Darku zowie się "WinAPI mousetracking" oraz w szerszym zakresie "WinAPI mouse handling"

0

Aj, jeszcze ostatnie w tym wątku, bo bym zapomniał!

Czy ja to zrobię w C? (nie c++ czy c#) w WinApi?

0

Zrobisz, WinAPI jest napisane w C właśnie.

1

Temat wydawał mi się dziwnie znajomy :)

Wprawdzie nie mam teraz tej książki przy sobie, ale od czego jest internet :D Bardzo podobny wątek był poruszony w książce Charlesa Petzolda "Programming Windows". Teraz to może mało popularna pozycja, ale w "moich czasach" od niej się zaczynało ;)

Znalazłem w necie link do niej w postaci PDF - http://vulms.vu.edu.pk/Courses/CS410/Downloads/Charles%20Petzold%20-%20Programming%20Windows%20-%205th%20Ed.pdf , nie wiem jak to się ma do praw autorskich, ale skoro nie ja to uploadowałem, to pewnie wielkiej zbrodni nie popełniam dzieląc się tym adresem (a w razie czego wystarczy w google wpisać "Petzold windows pdf" ).

Od strony 87 masz listingi programu sysmets (jest tam kilka jego wariacji). Myślę, że jak się z tym zapoznasz, to nie będziesz miał problemu ze zrobieniem dokładnie tego, czego chcesz.

A swoją drogą - książka jest mega wartościowa i warto, żebyś się z nią zapoznał.

0

Dzięki.
Książkę odpaliłem. Te kody źródłowe będą działaś na nowych windowsach?
I co ciekawe już na samym początku mowa o win98 - dobrze pamiętam, że na win95 nie byłoby szans?

0

Zasadniczo Windows API się nie zmieniło. Znaczy - z każdą wersją dochodzą nowe rzeczy, ale przy tym jest zachowana wsteczna kompatybilność.

Przeskok był z systemów 16-bitowych na 32-bit, a potem to już właściwie wszystko działa tak samo ;) Jest to oczywiście pewne uproszczenie, ale jak pisałem wcześniej - kompatybilność MUSI zostać zachowana. Tak więc apka, która była napisana dla Win95, w 99% przypadków powinna chodzić bezproblemowo z nowszymi Windowsami.

o win98 - dobrze pamiętam, że na win95 nie byłoby szans

Były by szanse. od 95 wszystkie nowsze Windowsy są 32-bitowe, więc kompatybilne z API opisanym w tej książce. Oczywiście - w oparciu o nią nie uzyskasz pełnego zakresu efektów, które są dostępne w nowszych Windowsach (chociażby pokazywanie progressu na przycisku aplikacji w pasku zadań), ale to wszystko (być może z jakimiś niewielkimi wyjątkami) co się w niej znajduje jest aktualne i działające.

0
cerrato napisał(a):

[...] Tak więc apka, która była napisana dla Win95, w 99% przypadków powinna chodzić bezproblemowo z nowszymi Windowsami.

Wliczając w to W10?

1

Co do zasady - tak.

Mogą się pojawić czasami problemy, jeśli np. używa DX albo jakichś "nietypowych" rozwiązań. Ale takie "standardowe" aplikacje - typu "stwórz okno, dodaj przyciski i menu, odbieraj zdarzenia z klawiatury i myszy i odpowiednio na nie reaguj" powinny dać radę.
Powtarzam - nie wykorzystasz w ten sposób pełni możliwości, jakie dają "nowe" Windowsy, ale aplikacja powinna działać.

Nie sugeruj się tym "windows 98" (albo 95) w książce - bo to, że były one pisane w tamtych czasach, nie oznacza wcale, że są nieaktualne. Cały system komunikatów, uchwyty okien, konteksty urządzeń, wskaźniki na struktury danych itp. działają tak samo, jak dawniej. Owszem - z czasem sa dodawane nowe elementy, ale nikt nie zmienia albo usuwa starych, bo to by było samobójstwo. Idea jest taka, że aplikacje pisane dla starszych Windowsów powinny działać na nowych. Przy czym podkreślam - od Win95 wzwyż. Bo od tego systemu mamy 32 bity i wielozadaniowość z wywłaszczaniem.

0

Dzięki!

2

Masz tu przykład obsługi ruchu myszy w WinAPI - na prawo, u góry masz odnośniki do innych części dokumentu, w tym requirement gdzie jest czarno na białym napisane, jaka wersja systemu jest wspierana, oraz co trzeba dodać do projektu aby z danej funkcjonalności skorzystać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1