Mehrere Systemweite Hotkeys & Hooks
-
Hallo !
Ich möchte in meinem Programm mehrere Systemweite Hotkeys verwenden und ausserdem systemweit mausklicks abfangen/erkennen. Dazu benutze ich die beiden Beiträge aus der FAQ :
http://www.c-plusplus.net/forum/viewtopic.php?t=39144
http://www.c-plusplus.net/forum/viewtopic.php?t=39184Das mit den Hotkeys funktioniert prima solange es nur einer ist.
Das mit der Maus funktioniert FÜR SICH auch gut aber wenn ich beides in einem Programm benutze (also einfach alles reinkopiert :)) dann hängt sich mein ganzes system auf
Kann mir villeicht jemand helfen damit mehrer Hotkeys zu benutzen und Hotkeys & Maus Systemweit in einem Programm zu erkennen ?
Vielen Dank im Vorraus !
-
hast du den hotkeys auch unterschiedliche ids gegeben?
kennst du GetLastError()?
oder das WinAPI forum?
-
Ja sie haben verschieden ID´s. Mit gleichen compiliert der BCB das gar nich erst. Ja ich kene das Winapi forum aber da beide von mir verwendete Tips aus der BCB FAQ stammen habe ich gehofft heir richtig zu sein.
(PS: warum wurde mein post "zensiert" ?)
-
ruf mal wenn nen RegisterHotkey() fehlgeschlagen ist GetLastError() auf und schlag den error code nach
-
Das kann ich leider nicht, da das Programm direkt nach dem starten das ganze system einfriert und ich nur noch reset drücken kann...
Ich konnte das Problem aber jetzt soweit eingrenzen das das Aufrufen der Funktion
SetHook(Handle);wohl der Auslöser ist. In einem neuen ("blanko") Projekt funktiert das mit dem Mousehook wunderbar nur eben in mein besttehendes Programm eingefügt kommt es zum crash. Da ich diese Funktion direkt am Anfang von OnFormCreate aufrufe nehme ich an das es was mit dem header oder den include dateier/definitionen zu tuen haben muss.
Die Dateien sehen so aus:.cpp:
#include <vcl.h> #include <fastmath.h> #include <windows.h> #include <winuser.h> #pragma hdrstop #define STRICT #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" // Die Funktionen aus der dem Projekt hinzugefügten LIB deklarieren extern "C" __declspec(dllexport) __stdcall void SetHook(HWND); extern "C" __declspec(dllexport) __stdcall void RemoveHook(void); extern "C" __declspec(dllexport) __stdcall MOUSEHOOKSTRUCT GetMouseData(void); TForm1 *Form1; ...diverser code... void __fastcall TForm1::WMHotKey(TMessage &Msg) { //What to do if Hotkey is pressed TForm::Dispatch(&Msg); ...diverser code... } void __fastcall TForm1::wmMessage(TMessage &Msg2) { if(Msg2.WParam == WM_RBUTTONUP) MessageBox(Handle, "YOU CLICKED RIGHT", "HUHU", MB_OK|MB_ICONINFORMATION|MB_SYSTEMMODAL); } void __fastcall TForm1::FormCreate(TObject *Sender) { // Den Hook starten SetHook(Handle); // Die Form vor alle anderen Fenster setzen, damit die Maus-Koordianten // immer präsent sind SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //Register F7 as a Hotkey unsigned int HotKeyIdentifier_uint = GlobalAddAtom("F7-Hotkey"); unsigned int HotKeyModifier_uint = 0; RegisterHotKey(Handle, HotKeyIdentifier_uint, HotKeyModifier_uint, VK_F7); ...diverser code... } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { RemoveHook(); }.h:
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Messages.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <jpeg.hpp> #include "pngimage.hpp" #include <ExtCtrls.hpp> // Userdefined Message // Wird beim Eingehen von Mouse-Messages von der DLL gesendet // und von der MainForm empfangen (s.u.: MESSAGE_MAP) #define WM_MOUSEHOOK WM_USER+100 //--------------------------------------------------------------------------- #include <ExtCtrls.hpp> #define STRICT // ********************** Für die Verwendung von GDIPlus notwendig ****************** #include <algorithm> using std::min; using std::max; #include <GDIPlus.h> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TImage *Image1; TMemo *FFile; TListBox *SList; void __fastcall Button1Click(TObject *Sender); void __fastcall FormClick(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); private: void __fastcall WMHotKey(TMessage &Msg); void __fastcall wmMessage(TMessage &Msg2); void __fastcall DrawSphere(int nr); void __fastcall KillSphere(int nr); ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartupInput gdiplusStartupInput; int GDIPlusStatus(Gdiplus::Image *GDIPlusImage); bool LoadPic2(AnsiString PicName,int x,int y); public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(void); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_HOTKEY, TMessage, WMHotKey) MESSAGE_HANDLER(WM_MOUSEHOOK, TMessage, wmMessage) END_MESSAGE_MAP(TForm) }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
-
Gibt es villeicht eine andere Möglichkeit systemweit mausklicks abzufangen/zuz erkennen ?