Komponentenentwicklung und Application Messages



  • Hi,
    ich entwickle gerade ein Komponente die den JournalRecordHook und den JournalPlaybackHook kapselt.

    Nun möchte ich dieser Komponente "beibringen" solche Messages, wie die WM_CANCELJOURNAL Message zu behandeln.
    Theoretisch würde es gehen, dass ich in Application->OnMessage eine Funktion der Komponente reinschreibe und da dann die Nachrichten auswerte. Allerdings gibt es Probleme wenn der Benutzer im Programm dann auch das Aplication->OnMessage Ereignis nutzen möchte.

    So, wie nun tun?

    MfG

    Alexander Sulfrian

    PS: Ich hab garade ca. 1h gegoogelt und gegoogelgroupet 😉 und hab keine nützlichen Hinweise gefunden. Zumal 50% des Codes im INet auch noch Delphi ist...



  • Hallo!

    Du müsstest dir im Konstruktor deiner Komponente einen Zeiger auf Application->OnMessage speichern.
    Dann machst du Application->OnMessage = DEINEFUNKTION;
    Und in Deiner Funktion rufst du dann wiederum die Funktion auf, die du in deinem Zeiger gespeichert hast.

    So müsste es gehn...

    tschüss
    Robert



  • Hi,
    und was passiert wenn jemand während der Anwendung das Application->OnMessage benutzt? Ergeht ja nicht automatisch davon aus, das ein Komponente dieses Ereignis benutzt. Und überschreibt meine Methode einfach....

    MfG

    Alexander Sulfrian



  • Wenn Du eine eigene Komponente enwickelst, kannst Du einfach die Windows-Hooks
    verwenden. Borland-Komponenten sind ja nichts anderes als spezielle DLLs. Ich
    habe das selbst auch schon gemacht und es funktioniert.

    Gruß,

    Alexander



  • Hi,
    meinst du so einen Hook wie in der FAQ beschrieben?

    Hört sich erstmal nicht schlecht an....
    Werd's mal ausprobieren.
    Danke

    MfG

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    meinst du so einen Hook wie in der FAQ beschrieben?

    Genau so einen.

    Gruß,

    Alexander



  • Irgendwie bekomme ich es nicht gebacken....
    Hast du vielleicht irgendwo ein Quellcodestück rumliegen?

    Danke

    MfG

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    Hast du vielleicht irgendwo ein Quellcodestück rumliegen?

    Ich werde morgen mal schauen.

    Gruß,

    Alexander



  • So, ich habe jetzt nochmal das Projekt wieder ausgegraben, in dem ich das verwendet habe. Vieles ist mehr oder weniger
    das, was auch schon in der FAQ zum Thema Windows-Hooks steht.

    So sieht die Projekt-cpp aus:

    #include <basepch.h>
    #pragma hdrstop
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Package-Quelltext.
    //---------------------------------------------------------------------------
    #include "MeineKomponente.h"
    
    //---------------------------------------------------------------------------
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
       if (reason == DLL_PROCESS_ATTACH)
          TMeineKomponente::ghInst = hinst;
       return 1;
    }
    //---------------------------------------------------------------------------
    

    Hier mal die wesentlichen Teile aus der Komponente:
    Header:

    class PACKAGE TMeineKomponente: public TComponent
    {
    private:
       HOOKPROC lpfnHookProc;
    
       void initializeHook();
       void deinitializeHook();
    protected:
       virtual void __fastcall Loaded(void);
    public:
       /* Summary
          Handle der Komponente
    
          Description
          FWindowHandle ist das Handle der Komponente. Dieses darf
          nicht verändert werden.                                  */
       static HWND FWindowHandle;
       /* Summary
          Internes Handle
    
          Description
          Dies ist das intern verwendete Handle für einen Windows-Hook.
          Das Handle darf nicht verändert werden.                       */
       static HHOOK hookHandle;
       /* Summary
          Handle des Package (bpl)
    
          Description
          Dies ist das Handle das von Windows dem Package zur Laufzeit
          zugeteilt wird.
    
          Es entspricht dem Handle einer Dll und darf nicht verändert
          werden.                                                      */
       static HINSTANCE ghInst;
    
       __fastcall TMeineKomponente(TComponent* AOwner);
       __fastcall ~TMeineKomponente();
    };
    HWND TMeineKomponente::FWindowHandle = NULL;
    HHOOK TMeineKomponente::hookHandle = NULL;
    HINSTANCE TMeineKomponente::ghInst = NULL;
    

    Und die entsprechende cpp:

    extern "C" __declspec(dllexport) __stdcall LRESULT CALLBACK CALLWNDProc(int, WPARAM, LPARAM);
    
    LRESULT CALLBACK __stdcall CALLWNDProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
       if (nCode < 0)
          return CallNextHookEx(TMeineKomponente::hookHandle, nCode, wParam, lParam);
       CWPSTRUCT* cwps = (CWPSTRUCT*) lParam;
       // Tun, was immer man möchte
       return CallNextHookEx(TMeineKomponente::hookHandle, nCode, wParam, lParam);
    }
    
    //---------------------------------------------------------------------------
    __fastcall TMeineKomponente::~TMeineKomponente()
    {
       if (!this->ComponentState.Contains(csDesigning))
          deinitializeHook();
    
       DeallocateHWnd(FWindowHandle);
    }
    
    void __fastcall TMeineKomponente::Loaded(void)
    {
       TComponent::Loaded();
    
       FWindowHandle = AllocateHWnd(WndProc);
       lpfnHookProc = GetProcAddress(GetModuleHandle("MeineKomponente.bpl"),"CALLWNDProc");
       if (!lpfnHookProc || !ghInst)
          ShowMessage("Fehler beim Initialisieren der Komponente. Überprüfen Sie, ob MeineKomponente in der Liste "
                      "der Laufzeitpackages enthalten ist.");
       initializeHook();
    }
    
    void TMeineKomponente::initializeHook()
    {
       if (!hookHandle)
          hookHandle = SetWindowsHookEx(WH_CALLWNDPROC, lpfnHookProc, ghInst, NULL);
    }
    
    void TMeineKomponente::deinitializeHook()
    {
       if (hookHandle)
       {
          if (!UnhookWindowsHookEx(hookHandle))
             ShowMessage("Hook konnte nicht entfernt werden");
          else
             hookHandle = NULL;
       }
    }
    

    Ich hoffe, ich habe nichts wesentliches vergessen. Ist schon 'ne Weile her...

    Gruß,

    Alexander


Anmelden zum Antworten