gpt4 book ai didi

c++ - 将 CALLBACK 从 dll 传递到 EXE

转载 作者:太空狗 更新时间:2023-10-29 21:07:15 25 4
gpt4 key购买 nike

我有一个 DLL,用于挂接记事本和捕获击键。一切正常,但我想从我的 exe 中访问 KeyboardHook 回调。因此,每次触发 .dll 中的回调时,它都会将其值传递给 .exe 这可能吗?

** HOOK.dll (hookDll.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;
}

KeyboardHook 中使用带有参数的 myCallbackRef

在你的程序中打电话

InstallMyHook(MyCallBack);

关于c++ - 将 CALLBACK 从 dll 传递到 EXE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com