之前有人问过类似的问题,但没有收到任何答案。我的问题有点笼统。
我正在寻找一种在 C# 应用程序中使用EasyHook 库的方法,这将使我能够拦截来自例如 notepad.exe 的关键打印 API 调用。
我的目标是将记事本的打印重定向到与选择的记事本不同的打印机。
当然,这只是一个人为的测试。但如果证明成功,我将使用该解决方案从无法配置目标打印机的实际遗留应用程序重定向打印。它只是打印到系统默认打印机,用户并不总是可以接受。
此外,该应用程序的原始源代码在多年前供应商停业时已经丢失,因此没有机会对其进行修改。但正如解释的那样,我希望使用 API 挂钩来解决它。
现在,问题是我不完全确定要挂钩哪些 API!
使用API Monitor v2我能够确定记事本调用了OpenPrinterW
内部PrintConfig.dll
。我无法找到这个特定 DLL 的标头,但我在winspool.drv中找到了一个非常相似的函数。
注意:我已经确定之前的陈述是错误的,这让我很高兴!除了winspool.drv中的功能之外,没有任何其他功能。我误读了 API Monitor 的输出,并假设它PrintConfig.dll
是实现库,而实际上它只是调用库。呸!但可悲的是,仍然没有雪茄,所以问题是存在的。
不幸的是,我所有的钩子尝试都失败了。我的代码根本没有被调用。另一方面,在我的所有测试中,钩子例如kernel32.dll
's 的工作正常。ReadFile
值得一提的是,我并没有特别赞同挂钩的想法OpenPrinterW
。我选择从这里开始的原因是:
- API Monitor 显示它确实是被调用的那个(至少被记事本调用)。
- 它看起来是正确的,因为它接受打印机名称并返回一个句柄,然后将其传递给其他打印调用。如果我可以在调用实际之前更改我的钩子中的打印机名称
OpenPrinterW
,我会觉得我可能 90% 在那里。
所以...有什么想法吗?