#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) 中被引用