2015-08-17 11 views
7

Widziałem kilka narzędzi dodających niestandardowy przycisk i/lub rysunek na pasku tytułu wszystkich okien wszystkich aplikacji w systemie Windows. Jak to się robi? Dodatkowe punkty za przykład w Delphi.Jak mogę narysować lub dodać niestandardowy przycisk do każdego okna wszystkich aplikacji?

EDIT: znalazłem coś dla DotNet które wykonuje to: http://www.thecodeking.co.uk/2007/09/adding-caption-buttons-to-non-client.html#.VdmioEDenqQ

+0

Czy możesz rozwinąć "dodatkowe punkty"? Przyznacie nagrodę za kogoś, kto napisze dla was kod? Jeśli chodzi o te narzędzia, dlaczego nie znajdziesz źródła dla jednego i pracy z tego. A jakie wersje systemu operacyjnego masz nadzieję obsłużyć? –

+0

@DavidHeffernan To typowe wyrażenie - "punkty bonusowe za ..." oznacza w tym kontekście ideał, a PO byłby z tego zadowolony. Czy znasz jakieś programy OS, które to robią? Ja nie. Widziałem Skype'a, Chrome itp. - ale nie znam wielu innych. Jeśli znasz jakieś, możesz napisać, czym one są? –

+0

Zażywasz to zbyt dosłownie. To tylko figura mowy. Chciałbym wesprzeć Windows 8.x i Windows 10. – dummzeuch

Odpowiedz

2

I nie zrobili tego, więc po to, co chciałbym zbadać gdybym spróbować:

  • Dla każdej aplikacji/each top-level window:
  • Tworzenie pływającego okna i umieszczenie go na pasek tytułu, gdzie chcesz usiąść. Set up the parent/child relationship, ale to okno jest częścią twojego własnego procesu. (Czasami pojawiają się problemy z rodzicielstwem okna z jednego procesu do jednego z innego procesu, ale spróbuj. Uniknęłoby to wstrzyknięcia do innych procesów, jeśli to możliwe.)
  • Możesz zbadać flagi okien, aby sprawdzić, czy okno ma pasek tytułu (jeśli powinieneś dodać przycisk) przez GetWindowLong z GWL_STYLE looking for WS_CAPTION. To samo połączenie pozwoli ci zobaczyć typ podpisu/ramki, który możesz połączyć z GetSystemMetrics za pomocą, na przykład, SM_CYDLGFRAME, aby znaleźć odpowiedni rozmiar dla przycisku na pasku tytułowym tego okna.
  • To okno jest teraz przyciskiem: maluj, obsługij kliknięcia itp.
  • Ustaw to okno, w którym nie można ustawić ostrości, aby kliknięcia nie odrywały się od okna, znajduje się na pasku tytułu. Nie chcesz klikać, aby na przykład zmienić kolor paska tytułu. Zrób to, ustawiając flagę okna WS_EX_NOACTIVATE, coś w stylu: SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) orWS_EX_NOACTIVATE).
  • Głównym problemem jest utrzymanie go prawidłowo ustawionego przy przesuwaniu okna, zmianie rozmiaru itp. Aby to zrobić, install a hook for the system move events. Możesz także przechwycić minimalizację i przywrócić za pomocą EVENT_SYSTEM_MINIMIZESTART and EVENT_SYSTEM_MINIMIZEEND. Umożliwi to śledzenie wszystkich okien poruszających się na ekranie, tak aby w razie potrzeby można było dostosować położenie okna przycisku.

To daje okno, które można malować jako przycisk (i reaguje na kliknięcia itp), że wizualnie jest „przywiązany” do innych okien, tak że pozostaje w tym samym miejscu, gdy użytkownik przeciągnie pasek tytułowy, minimalizuje lub maksymalizuje aplikację, itp., i to w twoim własnym procesie bez problemów z procesem krzyżowym.

4

Jak widzę tę pracę:

  1. Przede wszystkim powinniśmy być w stanie pomalować ten przycisk na własną rękę podpis okna. Procedura ta będzie używana później
  2. Ta część programu wylicza aktywnego i widocznych okien
  3. Ta część programu za pomocą wtrysku dołączyć naszą dll do wymienionych okien
  4. Od dll wtryskiwanego możemy wyciągnąć przycisk o podpisie okna
  5. wewnątrz tego dll powinniśmy przetwarzać kliknąć na przycisk
  6. powinniśmy mieć mechanizm, aby wysłać wynik do naszego głównego programu
Powiązane problemy