KeyBoardHook geht nicht



  • 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


  • Mod

    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


  • Mod

    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 mir

    InstallHook() 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));
    }
    //---------------------------------------------------------------------------
    

  • Mod

    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


Anmelden zum Antworten