Monitorowanie zawartości schowka      Strona 1 z 1
w oparciu o materiały ze stron The Bits

       W tym artykule wyjaśnię, jak przystosować Twoją aplikację do reagowania na zmianę zawartości schowka. Jest kilka możliwości wykorzystania tego, główne dwie to:

  • monitor schowka - to aplikacja, która obserwuje zawartość schowka i odbiera ją

  • włączanie i wyłączanie pozycji menu - kiedy schowek zawiera dane w formacie, który może przyjąć Twoja aplikacja, uaktywnia się pozycja "wklej"

          Jest jeszcze wiele innych zastosowań, ale to chyba najważniejsze.

          Etapy:

    1. Przyłączenie do łańcucha schowka.
    2. Odpowiadanie na komunikaty o zmianie zawartości schowka.
    3. Odpowiadanie na komunikaty o włączeniu lub wyłączeniu innych członków łańcucha.
    4. Usunięcie aplikacji z łańcucha po jej zakończeniu.

          Poniżej wyjaśnię jak zaimplementować te cztery etapy.

          Deklaracje

          Te deklaracje powinny zostać umieszczone w sekcji protected pliku nagłówkowego głównej formy.

        void __fastcall WMDrawClipboard(TMessage* Message);
        void __fastcall WMChangeCBChain(TMessage* Message);
        BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TMessage*, WMDrawClipboard)
            MESSAGE_HANDLER(WM_CHANGECBCHAIN, TMessage*, WMChangeCBChain)
        END_MESSAGE_MAP(TComponent)
    	
    Są to komunikaty, które będziemy odbierać kiedy zmieni się zawartość albo łańcuch schowka.

    Musimy również zachować uchwyt do następnego okna w łańcuchu (powody podam później):

        HWND NextHandle;
    
          To powinno zostać umieszczone w sekcji private.

    Teraz pora wpisać kod funkcji obsługujących te komunikaty.

          Przyłączanie do łańcucha schowka

          Normalnie dokonuje się tego w konstruktorze głównej formy aplikacji. Wszystko czego potrzeba to ten kod:

        NextHandle = SetClipboardViewer(Handle);
    	
    Dodajemy w ten sposób nasz uchwyt do łańcucha schowka, zwrócony uchwyt jest uchwytem do następnego członka łańcucha, ale o tym później.

          Odpowiadanie na zmianę zawartości schowka

          Za każdym razem, kiedy ulegnie zmianie zawartość schowka, otrzymamy komunikat WM_DRAWCLIPBOARD. W procedurze, którą zadeklarowaliśmy wcześniej, możemy teraz odpowiedzieć na zmianę zawartości schowka. Musimy również przekazać ten komunikat do następnego członka łańcucha. W poniższej funkcji zmienimy tytuł formy na zawartość schowka:

      void __fastcall TForm1::WMDrawClipboard(TMessage* Message)
      {
          //Dodaj tu kod odpowiadający na zmianę
          Caption = Clipboard()->AsText;
          SendMessage(NextHandle,WM_DRAWCLIPBOARD,0,0);
      }
    
          Odpowiadanie na zmiany w łańcuchu

          Musimy również zadbać o to, by po usunięciu lub dodaniu nowego członka do łańcucha został zaktualizowany uchwyt do następnego członka łańcucha:

      void __fastcall TForm1::WMChangeCBChain(TMessage* Message)
      {
        if((void *)Message->WParam == NextHandle)
            NextHandle = (void *)Message->LParam;
        else
            SendMessage(NextHandle,
                        WM_CHANGECBCHAIN,
                        Message->WParam,  // uchwyt do okna usuwanego
                        Message->LParam); // uchwyt do następnego okna
      }
    
          Opuszczanie łańcucha schowka

          Dokonujemy tego w destruktorze formy. Wszystko co musimy zrobić to usunąć aplikację z łańcucha:

    __fastcall TForm1::~TForm1()
    {
        // Nie zapomnij o deklaracji w nagłówku
    	ChangeClipboardChain(Handle, // nasz uchwyt do usunięcia
                             NextHandle ); // następby uchwyt w łańcuchu
    }
    
          Końcowe uwagi

          Aby użyć globalnego obiektu Clipboard należy dodać do nagłówka linijkę #include <Clipbrd.hpp>.

    Mam nadzieję, że ten tutorial przyda Ci się do czegoś :-)

          Tu możesz ściągnąć gotowe pliki źródłowe (C++ Builder 4)

    Uwaga: Autorzy oraz The Bits, nie ponoszą odpowiedzialności za ewentualne szkody wynikłe z postępowania według zasad tego samouczka.
    (c)1999 Allan Carlton.
    Tłumaczenie:  Maciek Frankiewicz