#ifdef HOOKLIB#else#define HOOKLIB extern "C" _declspec(dllimport)#endifHOOKLIB BOOL WINAPI StartCapture(LPDWORD lpdwVirtualKey, int nLength, HWND hWnd);
HOOKLIB BOOL WINAPI StopCapture(BOOL bActivate);
#include "stdafx.h"
#include <Windows.h>
#include <stdlib.h>#define HOOKLIB extern _declspec(dllexport)
#define WM_MY_SHORTS (WM_USER + 105)#include "CaptureHookDll.h"
LPDWORD g_lpdwVirtualKey = NULL; // Keycode 数组的指针
int g_nLength = 0; // Keycode 数组的大小
HINSTANCE g_hInstance = NULL; // 模块实例句柄
HHOOK g_hHook = NULL; // 钩子句柄
HWND g_hWnd = NULL;
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance = (HINSTANCE)hModule; // 在进程结束或线程结束时卸载钩子
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
delete g_lpdwVirtualKey; if (g_hHook != NULL)
UnhookWindowsHookEx(g_hHook);
break;
}
return TRUE;
}// 底层键盘钩子函数
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
BOOL bctrl = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT)*8)-1); //判断Ctrl键是否按下 KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
if (pStruct->vkCode == 80 && bctrl) //按下Ctrl+P
PostMessage(g_hWnd, WM_MY_SHORTS, 0, 1); return TRUE;
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
HOOKLIB BOOL WINAPI StartCapture(LPDWORD lpdwVirtualKey, int nLength, HWND hWnd)
{
g_hWnd = hWnd;
if (g_hHook != NULL)
return FALSE;
g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
if (!g_lpdwVirtualKey)
return FALSE;
for (int i = 0; i < nLength; i++)
{
*g_lpdwVirtualKey++ = *lpdwVirtualKey++;
}
g_nLength = nLength;
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);
if (g_hHook == NULL)
return FALSE; return TRUE;
}
HOOKLIB BOOL WINAPI StopCapture(BOOL bActivate)
{
if (UnhookWindowsHookEx(g_hHook) == 0)
return FALSE; g_hHook = NULL; return TRUE;
}
这是我的dll函数,但是在外面的工程引用导出函数不正确!
#include "CaptureHookDll.h"#pragma comment (lib, "CaptureHookDll.lib")
DWORD dwVK[] = {'P'};
int nLength = sizeof(dwVK) / sizeof(DWORD);
StartCapture(dwVK, nLength, this->m_hWnd);
错误消息ScreenDlg.obj : error LNK2019: 无法解析的外部符号 __imp__StartCapture,该符号在函数 "protected: virtual int __thiscall CScreenDlg::OnInitDialog(void)" (?OnInitDialog@CScreenDlg@@MAEHXZ) 中被引用
1>ScreenDlg.obj : error LNK2019: 无法解析的外部符号 __imp__StopCapture,该符号在函数 "public: long __thiscall CScreenDlg::OnShot(unsigned int,long)" (?OnShot@CScreenDlg@@QAEJIJ@Z) 中被引用
HOOKLIB BOOL WINAPI StopCapture(BOOL bActivate);
#include "stdafx.h"
#include <Windows.h>
#include <stdlib.h>#define HOOKLIB extern _declspec(dllexport)
#define WM_MY_SHORTS (WM_USER + 105)#include "CaptureHookDll.h"
LPDWORD g_lpdwVirtualKey = NULL; // Keycode 数组的指针
int g_nLength = 0; // Keycode 数组的大小
HINSTANCE g_hInstance = NULL; // 模块实例句柄
HHOOK g_hHook = NULL; // 钩子句柄
HWND g_hWnd = NULL;
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance = (HINSTANCE)hModule; // 在进程结束或线程结束时卸载钩子
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
delete g_lpdwVirtualKey; if (g_hHook != NULL)
UnhookWindowsHookEx(g_hHook);
break;
}
return TRUE;
}// 底层键盘钩子函数
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
BOOL bctrl = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT)*8)-1); //判断Ctrl键是否按下 KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
if (pStruct->vkCode == 80 && bctrl) //按下Ctrl+P
PostMessage(g_hWnd, WM_MY_SHORTS, 0, 1); return TRUE;
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
HOOKLIB BOOL WINAPI StartCapture(LPDWORD lpdwVirtualKey, int nLength, HWND hWnd)
{
g_hWnd = hWnd;
if (g_hHook != NULL)
return FALSE;
g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
if (!g_lpdwVirtualKey)
return FALSE;
for (int i = 0; i < nLength; i++)
{
*g_lpdwVirtualKey++ = *lpdwVirtualKey++;
}
g_nLength = nLength;
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);
if (g_hHook == NULL)
return FALSE; return TRUE;
}
HOOKLIB BOOL WINAPI StopCapture(BOOL bActivate)
{
if (UnhookWindowsHookEx(g_hHook) == 0)
return FALSE; g_hHook = NULL; return TRUE;
}
这是我的dll函数,但是在外面的工程引用导出函数不正确!
#include "CaptureHookDll.h"#pragma comment (lib, "CaptureHookDll.lib")
DWORD dwVK[] = {'P'};
int nLength = sizeof(dwVK) / sizeof(DWORD);
StartCapture(dwVK, nLength, this->m_hWnd);
错误消息ScreenDlg.obj : error LNK2019: 无法解析的外部符号 __imp__StartCapture,该符号在函数 "protected: virtual int __thiscall CScreenDlg::OnInitDialog(void)" (?OnInitDialog@CScreenDlg@@MAEHXZ) 中被引用
1>ScreenDlg.obj : error LNK2019: 无法解析的外部符号 __imp__StopCapture,该符号在函数 "public: long __thiscall CScreenDlg::OnShot(unsigned int,long)" (?OnShot@CScreenDlg@@QAEJIJ@Z) 中被引用
解决方案 »
- 请问如何切割TCP协议中的数据流?
- MFC MDI线程中获得CView类指针问题
- 我真是个白痴加废物
- 调用ReadProcessMemory访问其他进程的内存失败
- 串口 + WAVECOM WISMO2C2-G900/1800 + 手机短信编程, 救命!!!!!!!!!
- 这个问题很难,NT Service中如何广播式发消息
- 求教 CreateDIBSection 100分 在线等
- 请问,如何检测光驱内是否有盘,及是否是指定的光盘(比如用卷标确定)?
- 如何把屏幕的X坐标传到对话框的CEDIT控件中显示?
- setdefaultitem
- 55分,求解ocx里的诡异问题
- 谁有CMFCToolBar的源码?
漏了"C"
// 你是不是没有导出哦
#define HOOKLIB extern "C" _declspec(dllexport)
#else
#define HOOKLIB extern "C" _declspec(dllimport)
#endif