hook problem



  • hola leute

    hab mal das beispiel aus der FAQ 'tasten systemweit abfangen' ausprobiert und hab da so meine probleme. die dll bekommt zwar jeden tastendruck systemweit mit, jedoch bekommt das aufrufende programm nur die info ueber nen tastendruck wenn das programm selber den fokus hat.

    hier mal bissl was von der dll:

    bool __stdcall InstallHook(HWND t_hwnd)
    {
       hWindow = t_hwnd;
       HOOKPROC hook_proc =  GetProcAddress(GetModuleHandle("obdll.dll"), "HookProc");
    
       if(hook_proc == 0)
          return 0;
    
       ghook = SetWindowsHookEx(WH_KEYBOARD, hook_proc, ghInstance, NULL);
    
       return ghook;
    }
    
    bool __stdcall UninstallHook(void)
    {
       return UnhookWindowsHookEx(ghook);
    }
    
    extern "C" __declspec(dllexport) __stdcall DWORD HookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
       if((nCode < 0) || nCode == HC_NOREMOVE)
       {
          return CallNextHookEx(ghook, nCode, wParam, lParam);
       }
    
       char msg[120];
       sprintf(msg, "SendMessage(hWindow, WM_KEYHOOK, 0, lParam);\nlparam: %i", (int)lParam);
       SendMessage(hWindow, WM_KEYHOOK, wParam, lParam);
       MessageBox(0, msg, "DLL-Message", MB_OK); // nur damit ich seh ob SendMessage aufgerufen wurde
    
       return CallNextHookEx(ghook, nCode, wParam, lParam);
    }
    

    und was vom programm

    /* zuerst die *.h */
    /* diesen teil hab ich im publicbereich stehen */
    void __fastcall KeyHook(TMessage &Message);
       MESSAGE
          BEGIN_MESSAGE_MAP
             VCL_MESSAGE_HANDLER(WM_KEYHOOK, TMessage, KeyHook);
          END_MESSAGE_MAP(TForm);
    
    /* die funktion in der *.cpp */
    void __fastcall TFMain::KeyHook(TMessage &Message)
    {
       char Key[80];
       GetKeyNameText(Message.LParam, Key, 80);
       Memo1->Lines->Add(AnsiString("MSG: ") + Key);
    }
    

    sieht da jemand einen fehler ?
    die messagebox wird bei jedem tastendruck egal welches programm den focus hat aufgerufen. nur TFMain::KeyHook nicht.

    Meep Meep



  • re

    hab den fehler gefunden. jedoch weiß ich nicht wie ich ihn bereinigen soll.
    in meiner dll hab ich in der InstallHook funktion die zeile:

    hWindow = t_hwnd;
    

    hWindow ist eine globale variable in der ich den HWND meines programms speichere. nun bin ich draufgekommen, das hWindow den wert 0 hat, wenn der focus bei einem anderen programm liegt.
    wie kann ich das machen das hWindow immer den wert behaelt ?

    Meep Meep



  • Shared Memory nutzen.Stichwort CreateFileMapping

    Den Quellcode von
    http://www.marquardtnet.info/cecke/dlls.3/3_chhook.html
    kannst du anfordern


Anmelden zum Antworten