问题标签 [setwindowshookex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - 点击跟踪 Windows 应用程序
我对收集一个我没有编写且无法控制的应用程序的使用指标很感兴趣。这是在 Windows 上运行的应用程序。
我的计划是为鼠标和键盘事件注册一个全局窗口挂钩,并为具有预定标题或其他可识别属性的窗口记录这些事件。
使用这些数据,我希望能够确定用户如何使用相关应用程序。他们点击什么按钮,何时点击,以及常见的工作流程。等等。
对这个想法有什么想法吗?是否有第三方产品或库可以促进这种不需要修改现有应用程序的解决方案?
multithreading - 低级键盘 Hook 不在 UI 线程
我想为键盘钩子创建一个好的库。我使用了 SetWindowsHookEx 方法,我注意到如果我的应用程序的主线程很忙,则不会执行应该在任何系统 KeyDown 事件中调用的方法 hookProc。我认为钩子应该这样制作,另一个线程将对此负责。那可能吗?我该怎么做?
c# - 在 Windows XP 中使用 SetWindowsHookEx 时出错,但在 Windows 7 中没有
我开发了一个使用全局键盘/鼠标钩子的应用程序。它在 Windows 7 中完美运行,但在 Windows XP 中不适用。
当我在 Windows XP 中调用 SetWindowsHookEx 时,我收到错误代码 1428
c++ - 当用户点击一个键时显示一条消息
以下代码段旨在在用户键入密钥时显示消息。即使焦点不在应用程序上。但是下面的代码似乎有问题。它不会调用在 windows 的钩子链中注册的函数。我想问题出在HINSTANCE hInst
. 我应该如何修改下面的代码,以便在用户点击一个键时能够看到消息。
但是 windows 不调用该函数LowLevelKeyboardProc
。我不明白原因,但我确信问题出hInst
在钩子函数中。我需要如何初始化它?
到目前为止,我看到的输出是Inside function setWinHook !
c++ - 试图挂钩一个窗口的窗口过程。SetWindowsHookEx 失败返回 NULL HHOOK 并且 GetLastError 返回错误代码 126
概括
我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入本机 DLL(不是托管 DLL)的路径。然后用户键入将在挂钩过程中调用的方法的名称。该方法不能返回值并且必须是无参数的。然后它们是一个用于挂钩的按钮。
问题
我能够检索执行挂钩的库的模块句柄。此外,我还能够获取用户想要使用的模块句柄库,其中包含他/她想要挂钩的方法。另外,我能够接收用户想要挂钩的方法等的程序地址。
换句话说,它们不在返回的无效句柄上。除了挂钩的手柄 (HHOOK)
但是 SetWindowsHookEx 返回一个 NULL HHOOK 并且 GetLastError 返回错误代码 126 (ERROR_NO_MOD_FOUND)。
关于为什么我得到 ERROR_MOD_NOT_FOUND 的可能理论
- 全局钩子的数量是有限制的,因为我在某个地方读到了一个在钩子时遇到同样错误的人。
- 我没有得到将执行挂钩的 DLL 的正确模块句柄。但是话又说回来,我尝试了许多不同的方法来获取库 HMODULE/HINSTANCE 但都失败并出现相同的错误。
WinHooker.cpp
测试.cpp
主要代码
结论
任何帮助,将不胜感激。如果我做错了什么,请随时指出。这个项目是为了学习目的,所以告诉我需要修复什么,或者任何提示都会很棒。
c++ - ShowWindow 在 64 位操作系统上不能从 DLL 工作?
我有一个调用SetWindowsHook
来捕获键盘事件的进程。在处理事件的 DLL 中,我有条件地调用ShowWindow
设置挂钩的进程的窗口句柄。
该代码在 32 位操作系统 (XP) 上完美运行,并且在 64 位操作系统上作为 32 位应用程序运行,但是当编译为 64 位时,窗口不显示。
使窗口可见的代码是:
c# - 如何将 C++ SetWindowsHookEx 移植到 C# 或者这是不可能的?
我正在查看Microsoft KB318804中的示例,但他们使用“当前”应用程序的 threadId !!!我有一些可用的 C++ 代码,但我们必须重写它,而且我更愿意在 C# 中重写它。它所做的一件事是像这样获取目标应用程序的 threadId:
不,GetCurrentThread 不是正确的调用,因为我正在获取远程应用程序的线程 ID,这是我们今天所做的以及我们想要做的。targetHandle 是该远程应用程序的句柄。
我将此 lastId 转换为 int 并尝试连接 C# 代码,但 SetWindowsHookEx 返回 0 并失败。只有 AppDomain.GetCurrentThreadId() 似乎有效(即使它已被弃用,替换虽然也不起作用)。
那我必须使用C++代码吗?或者有没有办法让它在 C# 中工作?
目前,我们在 C++ 中向其他应用程序注册了 hookhandler 并获取事件。
c# - 另一个线程中的 KeyHook
在我的 C# 应用程序中,我想做 keyhook,但是,当按下键时调用的方法在另一个线程中调用。这样就不会发生我的程序省略一个键的情况,因为我的应用程序正忙于其他事情。我怎样才能使它在另一个线程中?我发现信息表明,根据我创建钩子的线程,按下键时调用的方法将在该线程中调用,但这不会发生。不管我在哪个线程中钩住它,这个方法总是在主线程中被调用。请帮忙。这是我的代码大纲:
SetWindowsHook 是以这种方式调用的,但 id 不会强制在另一个线程中调用该方法:
c++ - 如何修改运行时加载的 DLL 的导入地址表
我想挂钩在运行时从加载的 DLL 调用的函数,我使用了“Windows Via C/C++”一书中的 CAPIHook 类(由 Install System Wide hook 完成的 DLL Injecting 和 Modify IAT 完成的挂钩)但是这个仅当可执行文件的 IAT 中存在 DLL 名称/符号时,代码才起作用。(即用于隐式 DLL 链接)
这是 DLL 代码:
这是钩子函数:
更换IAT的方法:
作者添加了注释以添加此功能,但我不知道该怎么做
注意:只有在导出模块已经加载的情况下才能挂钩该函数。一种解决方案是将函数名称存储为成员;然后,在挂钩的 LoadLibrary* 处理程序中,解析 CAPIHook 实例列表,检查 pszCalleeModName 是否是已加载模块的名称以挂钩其导出表并重新挂钩所有已加载模块的导入表。
他也在书上写了这个,但我又不知道该怎么办
一种可能的解决方案是使用挂钩的 LoadLibrary* 函数来检测模块何时导出未修补的挂钩函数,然后执行两个操作:
再次挂钩已加载模块的导入表,因为现在可以调用 GetProcAddress 并获取指向要挂钩的函数的原始实现的指针。请注意,函数的名称需要存储为类成员并在构造函数中设置。
直接在导出模块的导出地址表中更新这个钩子函数,如 ReplaceEATEntryInOneMod 函数的实现所示。这样,所有调用挂钩函数的新模块都会调用我们的处理程序
我尝试在加载 DLL 后修改 IAT,但未调用我的挂钩函数
那么,如何修改此代码以处理动态加载情况?
c++ - CreateProcessWithDLLEx-Hooked 进程启动但无法恢复
我试图使用微软的弯路来获得一个基本的钩子。我的程序能够成功运行 CreateProcessWithDllEx 并注入一个 dll。但是,我似乎无法恢复实际的挂钩程序。我正在使用记事本进行测试,我可以看到notepad.exe 在我的进程列表中运行,但记事本窗口实际上从未出现过。
我的dll如下:
而我的喷油器如下:
我用 .def 文件构建了我的 dll,确保在序号 1 处有所需的函数,以便绕道正常工作:
有谁知道是什么导致进程无法运行?附带说明一下,我也尝试过使用空白 dll,它只包含序号 1 处所需的函数,没有其他内容,它似乎具有相同的结果。
此外,只要 notepad.exe 进程显示在进程列表中,我的注入器就会永远运行。这是对 WaitForSingleObject 的响应,这似乎表明进程已正确生成。