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.
DankeMfG
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