问题标签 [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.

0 投票
2 回答
147 浏览

setwindowshookex - 想要在使用 SetWindowsHookEx 读取后停止数据进入操作系统/应用程序

我正在开发一个简单的应用程序,它正在从操作系统读取击键。我使用 API“SetWindowsHookEx”来读取击键数据。

目前,数据由钩子读取并发送到操作系统或应用程序。

我想阻止这些数据进入操作系统或其他应用程序。使用“SetWindowsHookEx”读取数据后,有什么方法可以阻止数据进入 Windows 7 操作系统?

0 投票
1 回答
1319 浏览

c++ - 防止钩子dll加载

有没有办法设置进程安全权限或其他方式来禁用 Windows 加载全局窗口挂钩 dll?我不想禁用 SetWindowsHookEx,我只想禁用钩子 dll 在我的进程中加载​​。

0 投票
2 回答
2720 浏览

c# - CallWndProc 挂钩未收到所有消息

我正在制作一个像 Displayfusion 这样的小工具,当 Windows 移动/激活/等时我需要一些 Hooks 来接收消息,但是我被卡住了..

我将此项目用于 CallWndProc 挂钩: http: //www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

对于几乎所有的窗口(x86 和 x64)它都工作得很好,但是在某些窗口上它似乎无法注入钩子 DLL。目前我在使用 adobe reader X 时遇到问题。没有从该窗口收到任何消息。我认为这与沙盒有关?有人可以推动我朝着正确的方向前进吗?

钩子的初始化代码:

0 投票
2 回答
3087 浏览

c# - 调用外部 SetWindowsHookEx 和 GetModuleHandle 的 PInvoke 错误

我正在尝试将程序中的 Windows 挂钩设置为外部 EXE。这将用于监视窗口的大小调整/最小化,因此我可以类似地调整程序大小,停靠到窗口。

如何绕过下面的错误代码1428126

使用 null hMod调用SetWindowsHookEx时,我收到此错误1428。如果传递当前模块(而不是 IntPtr.Zero),我会得到相同的错误,它似乎正确,如下所示:

1428 =无法在没有模块句柄的情况下设置非本地挂钩

我还尝试使用GetModuleHandle来获取我作为模块连接的外部程序:

但是错误随后设置为:

126 =找不到指定的模块。

我正在使用以下 PInvoke 语句:

这是有问题的过程:

0 投票
1 回答
2771 浏览

windows - 水平滚动不起作用 mouse_event(MOUSEEVENTF_HWHEEL)

在 Windows 7 下的 Delphi 3 中调用此方法时没有水平滚动:

垂直滚动MOUSEEVENTF_WHEEL效果很好。结果与 相同SendInput,返回值表示成功。我当前的鼠标支持水平倾斜,但没有水平滚动条。

需要使用MOUSEEVENTF_HWHEEL什么?

SDK 文档:http ://bit.ly/mouse_event

鼠标钩

我在 Windows 7 下创建了第二个 32 位 exe 程序,只是为了查看鼠标在水平滚轮滚动时是否发送消息。此挂钩接收 VSCROLL 但不接收 HSCROLL 消息。

0 投票
1 回答
625 浏览

google-chrome - 如何在 Chrome 中获取页面加载事件的通知?

我需要能够在 Windows PC 上运行的浏览器中监视导航事件(例如页面加载或在活动选项卡之间切换)。到目前为止,我可以通过调用 SetWindowsHookEx 将 DLL 加载到所有正在运行的应用程序中,然后从应用程序请求 IHTMLDocument2(在 IE 中)或 nsIWebProgress(在 Firefox 中)接口,从而使其在 IE 和 Firefox 中工作。当感兴趣的事件发生时,我可以使用适当的接口从应用程序请求回调。

有没有办法在 Chrome 中做到这一点?我已经阅读了一些关于 Chrome 扩展的信息,但我没有找到任何关于 Chrome 公开的 API 的文档,该 API 类似于 IE 中的 COM 或 Firefox 中的 XPCOM。类似的方法会起作用还是我需要做一些完全不同的事情?(我正在使用 C++。)

如果有人至少能指出我正确的方向,我将不胜感激。

谢谢。

0 投票
1 回答
2642 浏览

winapi - 在 Hook 中从 HWND 获取 HMENU

我在我的应用程序中安装了一个钩子来获取标准的编辑上下文菜单(使用撤消/复制/编辑/粘贴/等)。我需要为我的应用程序插入一个新的菜单项。

我已经设置了一个 windows 挂钩,但我似乎无法获得上下文菜单的 HMENU。这是我设置钩子的地方:

这是我的回调函数:

我还尝试使用 WH_CALLWNDPROCRET 设置挂钩,但是这个甚至没有捕获菜单的 WM_CREATE 消息。

有谁知道如何为这种特殊情况获取 HMENU?

谢谢,凯文

0 投票
1 回答
432 浏览

winapi - SetWindowsHook Global 不是很全局

我正在玩 SetWindowsHookEx,特别是我希望能够通过鼠标或键盘找出任何已激活的窗口(在我的桌面上)。

阅读 SetWindowsHookEx 的 MSDN 文档,看起来 WH_CBT 类型可以完成这项工作。我创建了一个 dll 并将所有代码放在那里,我通过一个 gui 应用程序控制它(它也处理 unhook)。

但是,当我激活我的 gui 应用程序时,我似乎只获得了激活码,我激活的任何其他应用程序都会被忽略。

在我的 dll 中,我有设置代码和 CBTProc,如下所示:

所有非常简单的东西,我已经尝试将设置移出 dll,但我仍然得到相同的效果。

似乎 dll 正在加载到其他进程中,我正在计算我得到的 DLL_PROCESS_ATTACH 的数量,并且可以看到它的上升(我知道这不是很科学。

请注意,这是在 32 位操作系统 - win2k3 上运行的 32 位代码。

我对挂钩机制的期望是错误的吗?我应该只激活我的应用程序还是需要不同类型的钩子?

编辑:跟踪函数写入一个文件,告诉我什么发送给我激活

TIA。

0 投票
1 回答
2210 浏览

windows - 关于 SetWindowsHookEx() 和 hooking 的问题

这里有一些背景信息。AppInit_DLLs我正在通过注册表项替换已在 dll 注入技术中使用的 dll 。它的目的是存在于每个进程中,并在 GDI32.dll 中设置挂钩以收集有关打印的信息。这是一种获得我们想要的东西的时髦方式。.dll 本身已有 10 多年的历史(用 Visual Studio 97 编写),我们想用比注入的 dll 侵入性更小的东西来替换它。

这似乎SetWindowsHookEx()是我们正在寻找的东西。我一直遇到一些麻烦,但我也与同事讨论过这棵树是否值得吠叫。以下是一些我们无法确定的问题:

  1. 当我们从 dll 中挂钩例程时,例如StartDoc()从 GDI32.dll 中,是否真的每次其他进程使用该 dll 中的该例程时都会收到通知? 这是我们通过注入的 .dll 获得的功能,我们需要相同的功能。

  2. 当钩子被触发时,钩子处理过程是在发起实际调用的进程的进程空间中运行,还是在设置钩子的进程的进程空间中运行? 我的观点是它必须在调用例程的进程的进程空间中运行。例如,如果一个程序调用StartDoc()从 GDI32.dll 中,它将钩子处理程序代码“注入”到其空间并执行。否则,必须在调用进程和设置挂钩的进程之间自动建立一些进程间通信,我只是不认为是这种情况。此外,这个钩子处理例程在调用进程的进程空间中运行是必要的,因为它需要知道的一件事是该调用进程的名称,我不确定如何获取该信息,如果它实际上并没有在该过程中运行。

  3. 如果挂钩处理例程是使用 .NET 托管环境编写的,那么当挂钩到不使用 .NET 托管环境的进程时会中断吗?我们真的很想在这里摆脱 C++ 并使用 C#,但是如果我们的钩子从不受管理的进程中调用会发生什么?如前所述,我认为我们的钩子处理过程将在最初调用被钩子例程的进程中运行。但如果这是真的,那么我认为如果这个进程没有使用 .NET 运行时环境,但传入的钩子处理代码是,我们会遇到麻烦。

0 投票
4 回答
3685 浏览

hook - Win32 将 DLL 注入到针对“任何 CPU”构建的应用程序中

我正在开发一个捕获所有用户交互的项目。MSDN告诉(这个

SetWindowsHookEx 可用于将 DLL 注入另一个进程。32位DLL不能注入64位进程,64位DLL不能注入32位进程。如果应用程序需要在其他进程中使用钩子,则需要 32 位应用程序调用 SetWindowsHookEx 将 32 位 DLL 注入 32 位进程,64 位应用程序调用 SetWindowsHookEx 将 64 位DLL 转换为 64 位进程。

我的问题是,如果应用程序是针对Any CPU. 我是否需要SetWindowsHookEx从针对Any CPU.

我已经编写了 HookLogger_32.exe 加载 HookFunctions_32.dll(均为 x86)和 HookLogger_64.exe 加载 HookFunctions_64.dll(均为 x64)设置WH_CBTWH_MOUSE全局(不是特定线程)。

HookLogger_32.exe、HookLogger_64.exe、HookFunctions_32.dll 和 HookFunctions_64.dll 是用 C++ 编写的。

当我单击基于 .NET 构建的应用程序时Any CPU,这些 DLL 会被注入(通过SetWindowHookEx)。Windows 操作系统挂起,我必须强制重启我的机器。

当针对 x86 或 x64 构建相同的 .NET 应用程序时,当我在 HookLoggers(32 位和 64 位)启动后单击该应用程序时,一切正常。

这种未定义行为的任​​何原因。

我工作的平台是 64 位机器。