c++ - Windows 中的 WH_JOURNALRECORD Hook (C++) - 从未调用过回调。

标签 c++ windows

在过去的几个小时里,以下代码一直给我带来一些麻烦。 我正在尝试编写一个小程序(基于网络上的一些教程),它使用 WH_JOURNALRECORD 窗口 Hook 来记录击键。

主要代码:

#include "StdAfx.h"
#include <tchar.h>
#include <iostream>
#include <windows.h>

using std::cout;
using std::endl;

int _tmain(int argc, _TCHAR* argv[]) {  
    HINSTANCE hinst = LoadLibrary(_T("testdll3.dll")); 
    typedef void (*Install)();
    typedef void (*Uninstall)();
    Install install = (Install) GetProcAddress(hinst, "install");
    Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall");

    install();
    int foo;
    std::cin >> foo; 

    cout << "Uninstalling" << endl;
    uninstall();
    return 0;
}

动态链接库代码:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

HHOOK hhk;
HHOOK hhk2;


LRESULT CALLBACK journalRecordProc(int code, WPARAM wParam, LPARAM lParam) {  
    FILE * fileLog = fopen("journal.txt", "a+");
    fprintf(fileLog,"loggedJournal\n");
    fclose(fileLog);
    CallNextHookEx(hhk,code,wParam,lParam);
    return 0;
}


LRESULT CALLBACK wireKeyboardProc(int code,WPARAM wParam,LPARAM lParam) {  
 FILE * fileLog = fopen("keyboard.txt", "a+");
 fprintf(fileLog,"loggedKeyboard\n");  
 fclose(fileLog);
 CallNextHookEx(hhk,code,wParam,lParam);
 return 0;
}

extern "C" __declspec(dllexport) void install() {
    HINSTANCE thisDllInstance = LoadLibrary(_T("testdll3.dll"));
    hhk = SetWindowsHookEx(WH_JOURNALRECORD, journalRecordProc, thisDllInstance, NULL);
    hhk2 = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, thisDllInstance, NULL);
}
extern "C" __declspec(dllexport) void uninstall() {
    UnhookWindowsHookEx(hhk); 
    UnhookWindowsHookEx(hhk2); 
}

BOOL WINAPI DllMain(  __in  HINSTANCE hinstDLL, __in  DWORD fdwReason, __in  LPVOID lpvReserved) {
 return TRUE;
}

出于某种原因,键盘 Hook (SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc,..)) 有效(创建了“keyboard.txt”文件),但日志 Hook (SetWindowsHookEx(WH_JOURNALRECORD, journalRecordProc,...))没有。也就是说,永远不会调用日志 Hook 的回调(永远不会创建 journal.txt 文件)。

我认为这可能与 Windows 的 UAC(我在网上搜索时发现的)有关,但禁用 UAC 并以管理权限运行该程序没有帮助。

我不知道现在该怎么办。谁能帮帮我?

谢谢

乔里斯

附加信息:我使用的是 Windows 7 + Visual Studio 2010

编辑: 原来这确实和访问权限有关。也就是说,自 Windows Vista 起,日志 Hook (WH_JOURNALRECORD) 出于安全原因被禁用(另请参阅 this website )。最后,我们使用完全不同的方法在我们的应用程序中提供类似的功能(我不会在这里详细介绍,因为我在问这个问题 1.5 年后编辑这个问题,我不记得所有的我们解决方案的详细信息)。

最佳答案

WH_JOURNALRECORD 与其他的不同。您不需要将它放入 DLL 中,但您确实需要在您的应用程序中有一个消息循环,以便可以调用处理程序(在您的应用程序的上下文中)。我前段时间在另一个网站上发布了一个示例:http://forum.4programmers.net/viewtopic.php?p=557297#id557297 ,钩子(Hook)在示例中捕获 WM_MOUSEMOVE 并将结果打印到控制台。

这种钩子(Hook)很昂贵,因为每次调用回调时,执行上下文都必须切换到您的应用程序。

关于c++ - Windows 中的 WH_JOURNALRECORD Hook (C++) - 从未调用过回调。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3157212/

相关文章:

c++ - 如何使用 fscanf 提取 html

java - java/c++ 中的 WLAN SSID

java -/tmp 的最佳 Windows 等价物是什么?

php - 意外关机后控制

c++ - 编辑存储在字节数组中的数据

Windows 操作系统无法打开适用于 linux 的文件名

c++ - win7 64 上使用 Python 2.7.9 的 pyproj 给出 "Unable to find vcvarsall.bat"

windows - 带有 yarn 的终端中的不可见文本

c++ - 具有继承性的模板参数推断

c++ - 400.0 - 使用 MSXML2::IXMLHTTPRequestPtr 的错误请求