返回信息流大概的思路如下,首先自己制作一个叫KeyBoardHookLib的dll文件,然后在KeyBoardHookTest中调用dll中的SetHook函数。
以下是代码:
/*******************
Dll:KeyBoardHookLib.h
*******************/
#define EXPORT extern "C" __declspec(dllexport)
#pragma data_seg("shared")
HHOOK hKeyBoard = NULL;
HINSTANCE hDllInstance = NULL;
#pragma data_seg()
#pragma comment (linker, "/section:shared,rws")
EXPORT BOOL WINAPI SetHook (BOOL isInstall);
/******************
Dll:KeyBoardLib.cpp
******************/
#include <windows.h>
#include "KeyBoardHookLib.h"
#include <fstream>
using namespace std;
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdsReason, PVOID pvReserved)
{
hDllInstance = hInstance;
return true;
}
LRESULT CALLBACK KeyboardProc (int nCode, WPARAM wParam, LPARAM lParam)
{
EVENTMSG *keyMSG = (EVENTMSG*) lParam;
if ((nCode == HC_ACTION) && (keyMSG->message == WM_KEYDOWN))
{
TCHAR keyName[10];
ZeroMemory (keyName, 10);
GetKeyNameText (lParam, keyName, 50);
ofstream out("out.txt");
out << keyName;
out.close();
}
return CallNextHookEx (hKeyBoard, nCode, wParam, lParam);
}
EXPORT BOOL WINAPI SetHook (BOOL isInstall)
{
if (isInstall)
{
hKeyBoard = SetWindowsHookEx (WH_KEYBOARD, KeyboardProc, hDllInstance, 0);
if (hKeyBoard != NULL)
return true;
}
else
{
UnhookWindowsHookEx (hKeyBoard);
hKeyBoard = NULL;
hDllInstance = NULL;
}
return false;
}
/*****************
exe:KeyBoardTest.cpp
*****************/
#include <windows.h>
#include <stdio.h>
BOOL (WINAPI *useSetHook) (BOOL);
int main()
{
HMODULE hKeyBoardHookLib = ::LoadLibrary (L"KeyBoardHookLib.dll");
useSetHook = (BOOL (__stdcall *)(BOOL))::GetProcAddress (hKeyBoardHookLib, "SetHook");
if (!useSetHook)
{
printf ("Failed!\n");
system("pause");
return 0;
}
char a;
useSetHook(true);
scanf ("%c",&a);
system("pause");
return 0;
}
我使用vs2008编译的。问题是,我已经把dll和lib文件都放到exe的debug目录下了,但exe只能载入dll文件,但找不到SetHook函数,也就是说
HMODULE hKeyBoardHookLib = ::LoadLibrary (L"KeyBoardHookLib.dll");
一句没有问题,但下一句
useSetHook = (BOOL (__stdcall *)(BOOL))::GetProcAddress(hKeyBoardHookLib, "SetHook");
的执行结果是useSetHook为零。
不知道是哪错了,哪位大牛能解答一下,谢谢!
这是一条镜像帖。来源:北邮人论坛 / cpp / #32793同步于 2009/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于windows编程的问题,求高手解!
OdieHappy
2009/12/6镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
额~~那条api要求参数是宽字符,去掉就编译不过了.......
【 在 jmpesp 的大作中提到: 】
: (L"KeyBoardHookLib.dll"); ?
: 把L去掉就可以了 L是表示宽字符的意思
【 在 OdieHappy 的大作中提到: 】
: 额~~那条api要求参数是宽字符,去掉就编译不过了.......
那条api要求是宽字符?
LoadLibrary有两个版本 一个是LoadLibraryA另一个是LoadLibraryW
你这代码配置设置对吗?