KeyBoardHook geht nicht
-
Hi,
ich habe vor einen Keyboardhook zu proggen.
Ich bin zur Zeit gerade bei der DLL.//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #pragma hdrstop #pragma argsused HHOOK HookHandle; int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- __declspec (dllexport) LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wparam,LPARAM lparam) { if(nCode == HC_ACTION) { }else{ } return (CallNextHookEx(HookHandle,nCode,wparam,lparam)); } //--------------------------------------------------------------------------- __declspec (dllexport) bool InstallHook(void) { HookHandle = NULL; HookHandle = SetWindowsHookEx(WH_KEYBOARD,&KeyboardProc,HInstance,NULL); if (HookHandle == NULL) { return false; }else{ return true; } } //--------------------------------------------------------------------------- __declspec (dllexport) bool UninstallHook(void) { return (UnhookWindowsHookEx(HookHandle)); }Allerdings kommen 2 Errors.
[C++ Error] dll.cpp(50): E2034 Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
[C++ Error] dll.cpp(50): E2342 Type mismatch in parameter 'lpfn' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned int,long)')
Was könnte die Ursache dafür sein?
-
KeyboardProc muss nicht exportiert werden und du hast die Adresse der Funtion bei SetWindowsHookEx angegeben!
also das declsepec(dllexport) und den Adress-Operator entfernen.
-
Hmm geht irgendwie immer noch nich(gleiche Fehler).
Aber müsste der Parameter bei SetWindowsHookEx nicht ein Pointer sein?MFG Ace
-
-
Hmm.
Verstehe nicht ganz was mir das hilft?MFG Ace
-
Kontrolliere doch mal wo und wie HOOKPROC bei Dir deklariert ist. Ich sehe so keinen Fehler aber anscheinend ist bei Dir HOOKPROC als Funktion ohne Argumente deklariert.
-
Also ich habe das jetzt mit typisieren gelöst.
Aber was meinst du mit fehlenden Argumenten?MFG
AcE
-
Nun ich lese das aus der Fehlermeldung. Der Compiler-Fehler lautet:
'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'Also kann er eine Funktionszeiger der long returniert und int, unsigned int und long als Argument annimmt nicht in einen Funktionszeiger umwandeln, der int returniert und keine Argumente hat.
-
????
Hmm verstehe ich nicht.
Allerdings konnte ich das problem beheben, indem ich einfach:__declspec (dllexport) bool InstallHook(void) { HookHandle = NULL; HookHandle= SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,hDllInstance,NULL); if (HookHandle == NULL) { return false; }else{ return true; } }Jetzt kopiliert er zwar alles anstandslos. Aber
wenn ich die funktion in mein prog einbinde gibt mirInstallHook() immer false zurück.
MFG Ace
-
SO hier der COde:
Programm:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #pragma comment(lib, "keydll.lib") #include "prog.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; __declspec(dllimport) int InstallHook() ; //Als Übergabeparameter nur den Typ angeben. __declspec(dllimport) int UninstallHook() ; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Label1->Caption=BoolToStr(InstallHook()); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { UninstallHook(); } //---------------------------------------------------------------------------keydll:
//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #include <stdio.h> #pragma hdrstop #pragma argsused HHOOK HookHandle; FILE * f1; HINSTANCE hDllInstance ; LRESULT CALLBACK KeyboardHookProc(int nCode,WPARAM wParam, LPARAM lParam) { if(nCode==HC_ACTION){ f1 = fopen("C:\report.txt","w"); } fclose(f1); LRESULT RetVal = CallNextHookEx( HookHandle, nCode, wParam, lParam ); return RetVal; } //--------------------------------------------------------------------------- __declspec (dllexport) bool InstallHook(void) { HookHandle = NULL; HookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,hDllInstance,NULL); if (HookHandle == NULL) { return false; }else{ return true; } } //--------------------------------------------------------------------------- __declspec (dllexport) bool UninstallHook(void) { return (UnhookWindowsHookEx(HookHandle)); } //---------------------------------------------------------------------------
-
hDllInstance musst Du initialisieren mit dem Wert der in DllMain übergeben wird.
-
Ja hab ich mir schon gedacht.
Aber sry wenn ich das frage:
Wie macht man das?Also einfach HInstace davor setzen?
Edit:Sry hätte besser lesen sollen.
Danke jetzt gehts.
MANY THX!!! Weitere fragen werden kommen :D:D:D:D.
MFG ace