Windows Hook过程出现问题

时间:2011-03-20 11:01:15

标签: c winapi hook

我写了一个小应用程序来了解事件发生的时间。我在main.c中安装了钩子程序,然后程序等待10秒并取下钩子。在暂停期间,我(尝试)生成一些事件,并且对于每一个事件,在log.txt中打印“x”shuld。我在msdn中读取了hook参数,我正在使用命令行中的Mingw,在Win7上...(也许)抱歉我的BAD英语:'(。 我基本上搜索了教程,但我一无所获。

// my DLL's code
#include <windows.h>
#include <stdio.h>
#include "dll_header.h"

EXPORT LRESULT CALLBACK hookproc (int nCode, WPARAM wParam, LPARAM lParam){
FILE *fp = fopen ("log.txt", "wb");
fprintf(fp, "\nx");
fclose(fp);
return CallNextHookEx(NULL, nCode, wParam, lParam);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
FILE *fp = fopen ("log.txt", "wb");
fprintf(fp, "\nOk, the DLL is called");
fclose(fp);
return TRUE;
}

// this is the main.c
#include <windows.h>
#include "dll_header.h"
#include <stdio.h>

EXPORT LRESULT CALLBACK hookproc(int nCode, WPARAM wParam, LPARAM lParam);

int main(){
HMODULE hm = LoadLibrary ("lib.dll");
printf("\n%x", hm); // for my feedback

HHOOK hh = SetWindowsHookEx (WH_KEYBOARD, hookproc, hm, 0);
printf("\n%x", hh); // for my feedback

Sleep(10000);

BOOL b = UnhookWindowsHookEx (hh);
printf("\n%x", b); // for my feedback
return 0;
}

我认为代码很容易出现错误,所以在log.txt中,我发现每种类型的钩子都只有“Ok,DLL被调用”(不仅仅是WH_KEYBOARD)。你可以帮帮我吗?

修改

好吧,我用w / a改变了“fopen”mod ...为什么我要写一个消息循环?这不是一个winows程序,系统不会为每个事件调用钩子程序吗?我无法理解为什么我的钩子程序没有被调用,你能修改我的代码所以我知道何时调用钩子程序??

ps。:我正在阅读关于从msdn挂钩的文章,你知道另一个好/更好的地方去学习吗?

1 个答案:

答案 0 :(得分:2)

  • 您正在安装系统范围的挂钩 - 该文件可以由多个进程打开和写入,所有这些进程都会覆盖其他进程创建的文件。
  • 您没有消息循环,因此不会为您的应用程序调用该挂钩。调用GetMessage / PeekMessage
  • 时会触发WH_KEYBOARD