如何使用 SetWindowsHookEx 和 WH_KEYBOARD 挂钩外部进程

2023-12-26

我试图挂钩例如记事本但没有成功。制作一个全局钩子似乎效果很好。

在 XP SP2 上测试。

编辑:修改后的代码现在可以使用。

MyDLL代码

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

HINSTANCE hinst;
#pragma data_seg(".shared")
HHOOK hhk;
#pragma data_seg()
//#pragma comment(linker, "/SECTION:.shared,RWS") compiler error in VC++ 2008 express

LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) {  
    if (code < 0) {
        return CallNextHookEx(0, code, wParam, lParam);
    }
    Beep(1000, 20);
    return CallNextHookEx(hhk, code, wParam, lParam);
}

extern "C" __declspec(dllexport) void install(unsigned long threadID) { 
    hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, threadID);
}
extern "C" __declspec(dllexport) void uninstall() {
    UnhookWindowsHookEx(hhk); 
}

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

我的程序

#include <Windows.h>

unsigned long GetTargetThreadIdFromWindow(char *className, char *windowName)
{
    HWND targetWnd;
    HANDLE hProcess;
    unsigned long processID = 0;

    targetWnd = FindWindow(className, windowName);
    return GetWindowThreadProcessId(targetWnd, &processID);
} 

int _tmain(int argc, _TCHAR* argv[]) {
    unsigned long threadID = GetTargetProcessIdFromWindow("Notepad", "Untitled - Notepad");
    printf("TID: %i", threadID);    

    HINSTANCE hinst = LoadLibrary(_T("MyDLL.dll")); 

    if (hinst) {
        typedef void (*Install)(unsigned long);
        typedef void (*Uninstall)();

        Install install = (Install) GetProcAddress(hinst, "install");
        Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall");

        install(threadID);

        Sleep(20000);

        uninstall();
    }

    return 0;
}

三个问题:

当您应该使用线程 ID 时,您却使用了进程 ID。

你的 HHOOK 需要进入共享内存:

#pragma data_seg(".shared")
HHOOK hhk = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")

您需要通过您的HHOOK to CallNextHookEx:

return CallNextHookEx( hhk, code, wParam, lParam);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 SetWindowsHookEx 和 WH_KEYBOARD 挂钩外部进程 的相关文章

随机推荐

  • 如何有效地随机选择数组项而不重复?

    我知道这个问题有很多形式 但我一直无法找到与我的具体效率问题相关的答案 我有下面的代码 效果很好 我有一个包含 10 个项目的数组 我从中随机选择一个项目 按 Enter 键时 该代码保留了一个由 5 个最近选择组成的数组 这些选择不能随机
  • 在 IE7 中,parent.document.getElementById("...") 为 null 或不是对象

    我做了一些研究 但作为一个 JavaScript 新手 我似乎无法为我的具体情况找到任何有用的东西 我的页面中有一个 iframe 在该 iframe 的文档中 我有以下代码 function fun var slideTitle api
  • 如何使用Jquery获取按钮的id值?

    我有一个带有动态创建的编辑按钮的表格 按钮的 ID 是一个字符串 附加有表内容 ID IE
  • PowerShell 脚本返回意外输出(随机数)

    Problem我正在 PowerShell 中编写一个脚本 将文件上传到 http 服务器 上传成功完成 但执行时在控制台中返回一堆数字 远远超过下面显示的数字 Output 这是我正在运行的脚本 Param Parameter Manda
  • 在 Prolog 中解决文本逻辑难题 - 查找生日和月份

    我正在阅读 7天7种语言 一书 并且已经读到了Prolog章节 作为学习练习 我试图解决一些文本逻辑难题 谜题如下 五姐妹的生日都在不同的月份 并且各自在一周的不同日期 使用下面的线索 确定每个姐妹的生日是在月份和星期几 宝拉出生于三月 但
  • JS:如何检查按钮是否被禁用?

    我想检查按下或未按下的按钮 我怎样才能做到呢 我已经尝试过这样做 但它不起作用 这是我的代码
  • 现在允许重新定义 constexpr 静态数据成员吗? (但不是内联常量)?

    以下代码在 c 14 中的 gcc 和 clang 下均无法编译 但在 c 1z 中编译成功 struct Cls static constexpr int N 0 constexpr int Cls N constexpr int Cls
  • 您将如何在这里使用敏捷? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是敏捷的大力支持者 但我的一个朋友 他还不知道敏捷 他是管理类型 问我如何规划和开发一个复杂的分布式项目 其中包含数据库层 通信层层 接口以及
  • 使用 Go 获取 Python 版本

    我正在尝试使用 Go 获取我的 Python 版本 import log os exec strings func verifyPythonVersion err exec LookPath python if err nil log Fa
  • 将 dll 与 node-ffi 一起使用

    我正在使用 node ffi 访问我购买的自定义硬件提供的 dll 该 dll 使用设备驱动程序来执行操作 他们不提供 dll 文档 但他们有一个 c 中的示例应用程序 该 dll 在 c 中使用像这样 DllImport POS CIDR
  • 我对 REST 有什么不理解的地方?

    我正在构建一个框架 并希望使用它进行构建的开发人员能够允许其部分内容与其他站点共享数据并允许其他站点添加 编辑 删除数据 例如 如果有人制作了一个包含书评 作者 引言 代码示例 评论等的网站 那么开发人员可以制作例如 书评 对于其他网站来说
  • 处理 django 包含模板标签中的请求

    我是 Django 新手 正在尝试将上传文件表单放入包含标签中 所以我可以在各种模板中使用它 我创建了以下包含标签 upload files py register inclusion tag upload form html def up
  • PrimeFaces p:fileUpload 不调用方法

    我正在尝试使用 PrimeFaces
  • MVVM 是否违反了 DRY?

    看来我制作的 ViewModels 看起来可疑地像其他班级一样而且它们似乎需要大量的代码重复 例如在当前的项目中我有 SmartForm Model that represents a data form to fill in has pr
  • 将本地图片上传到tinyMCE

    tinyMCE有一个插入图像按钮 但如何处理其功能 请给出一些代码 我已经对 pavanastechie 编写的代码投了赞成票 但最终我重写了很多次 这是一个更短的版本 可能对某些人有价值 tinymce init toolbar imag
  • 如何在Python中创建链表

    我正在尝试解决 python 中的链表编码挑战 我只给出了以下课程来创建链接列表 Definition for singly linked list class ListNode object def init self x self va
  • 单击小部件时播放声音

    这是我的代码 它打开主要活动 但我似乎找不到一种方法来让小部件播放声音 我尝试过了 向小部件添加一个按钮 不起作用 add an OnClickListener到主要活动 有效 但它打开主要活动 我只想要声音而不是活动 编写一个新方法来播放
  • 了解 ASP.NET WebForms 中控件处于生命周期的哪个阶段

    从控件的外部 是否可以找出特定控件或页面处于页面生命周期的哪个阶段 初始化 加载 预渲染等 例如 在伪代码中 if myControl CurrentLifeCycle Lifecycle Init do something 恐怕没有内置函
  • Qt QSqlQuery 准备和bindValue 不工作

    我在准备和绑定值时遇到问题 db open QSqlQuery q q prepare SELECT id malade nom prenom FROM Malade WHERE nom LIKE p OR prenom f q bindV
  • 如何使用 SetWindowsHookEx 和 WH_KEYBOARD 挂钩外部进程

    我试图挂钩例如记事本但没有成功 制作一个全局钩子似乎效果很好 在 XP SP2 上测试 编辑 修改后的代码现在可以使用 MyDLL代码 include