从dll传递回调到EXE

Passing CALLBACK from dll to EXE

本文关键字:EXE 回调 dll      更新时间:2023-10-16

我有一个DLL,我用它来钩住记事本并捕捉击键。一切都很好,但我想从我的exe中访问KeyboardHook回调。因此,每次回调在。dll被触发,它传递它的值给。exe这是可能的吗?

** HOOK.dll (hook .cpp) **

#include "windows.h"
#pragma data_seg (".SHARED")  
     HHOOK keyboardHook = 0;  
     HINSTANCE g_hInstance = 0;  
#pragma data_seg()  
#pragma comment(linker, "/SECTION:.SHARED,RWS")
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(0 > nCode)
    return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
    {
        MessageBox(NULL, L"Got Keyboard Event !", L"Event", 0);
    }
    return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
extern "C" __declspec(dllexport) bool InstallKeyboardHook(unsigned long threadID)
{
    keyboardHook = SetWindowsHookEx(WH_KEYBOARD, &KeyboardHook, g_hInstance, threadID);
    return true;
}
extern "C" __declspec(dllexport) bool UnInstallKeyboardHook()
{
    UnhookWindowsHookEx(keyboardHook);  
    return true;
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved ) 
{     
switch (ul_reason_for_call){
    case DLL_PROCESS_ATTACH:
        g_hInstance  = (HINSTANCE) hModule;
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
}     
return TRUE; 
}

** Hook.exe (hook.h) **

#pragma once
#include "afxwin.h"
typedef bool(*InstallHook)(unsigned long);
typedef bool(*UnInstallHook)();
typedef LRESULT (*KeyboardHook)(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK MyCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    //Id like this to get called whenever the CALLBACK in the dll is called
    MessageBox(NULL, L"test", L"test", 0);
    return NULL;
}

class CTrayMeApp : public CWinApp
{
public:
CTrayMeApp(){};
~CTrayMeApp(){};
virtual BOOL InitInstance();
};
extern CTrayMeApp theApp;

** Hook.exe (hook.cpp) **

#include "hook.h"
CTrayMeApp theApp;
BOOL CTrayMeApp::InitInstance()
{
BOOL bReturn = FALSE;
CWinApp::InitInstance();
HMODULE hModule = LoadLibrary(_T("Hook.dll"));
//Get the function address which installs the keyboard events filter.
InstallHook fpKeyboardHook = (InstallHook) GetProcAddress(hModule,"InstallKeyboardHook");
//Install the Keyboard Event Hook (Filter).
fpKeyboardHook(GetTargetThreadIdFromWindow("Notepad", "Untitled - Notepad"));
//Install the Callback
KeyboardHook cpKeyboardHook = (KeyboardHook) GetProcAddress(hModule,"_KeyboardHook@12");
//OK, are callback is here, now how do we make use of it?
KeyboardHook(MyCallback); //of course this won't work, but it gives an idea of what I'm trying to do.
FreeLibrary(hModule);
Sleep(10000); //give us 10 seconds to test it out
return bReturn;
}

DLL内部:

LRESULT CALLBACK (*myCallbackRef)(int nCode, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) void InstallMyHook(LRESULT CALLBACK (*MyCallback)(int nCode, WPARAM wParam, LPARAM lParam))
{
   myCallbackRef = MyCallback;
}

使用myCallbackRefKeyboardHook内部的参数

在你的程序中叫

InstallMyHook(MyCallBack);