Tag: hook

没有调用WH_KEYBOARD_LL挂钩

我在使用WH_KEYBOARD_LL钩子时遇到了一些问题: 我使用全局LL钩子的原因并不重要我只需要它为我的应用程序(我尝试了其他类型的钩子,但它们对我不起作用)。 钩子函数在一个dll中,dll在应用程序启动时加载,钩子也在主线程启动时设置。 这非常有效。 当我需要停用挂钩并重新激活它时,会出现问题。 如果我从应用程序的主线程执行此操作它可以正常工作,但我需要的是从计时器执行此操作,这里出了问题。 我使用计时器来检查我的应用程序的窗口是否是前台窗口(活动窗口),如果是,则挂钩被激活,如果不是,则挂钩被停用。 从计时器调用时SetWindowsHookEx的返回值总是ok(非null),根据MSDN,这意味着钩子已成功设置,但我的钩子函数永远不会被调用。 以下是我设置钩子的方法: SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0); 有没有人经历过这个? 我唯一的猜测是我的钩子函数在一个DLL中,而计时器回调来自另一个dll,这与我的问题有什么关系吗?

禁用Alt键的正常行为

按Alt键时,通常焦点将转到窗口菜单。 我需要全局禁用它。 因为我的应用程序使用Alt键。 当用户与Alt键结合使用某个键时,我的应用程序会向活动应用程序发送另一个键。 所以我只需要在打开菜单时忽略Alt 。 我是编程新手,我正在寻找VB.Net或C#代码。

通过FindWindowEx获取所有控件

我正在构建一个应用程序,它将获得所有控件已进入应用程序winform正在运行。 首先,我可以将dll注入应用程序winform正在运行并获取应用程序winform的句柄正在运行。 在我将所有子窗口变为applcation之后。 接下来,我想通过FindWindowEx将所有控件放入子窗口。 但我不能 这是代码: static ArrayList GetAllChildrenWindowHandles(IntPtr hParent, int maxCount) { ArrayList result = new ArrayList(); int ct = 0; IntPtr prevChild = IntPtr.Zero; IntPtr currChild = IntPtr.Zero; while (true && ct < maxCount) { currChild = FindWindowEx(hParent, prevChild, null, null); if (currChild == IntPtr.Zero) { int errorCode = Marshal.GetLastWin32Error(); break; } result.Add(currChild); […]

按Tab键几次后不再调用线程钩子程序。 为什么?

我安装了一个特定于线程的窗口挂钩来监视发送到WndProc的消息。 它起初工作。 然而,在我按Tab键约19次以在表单周围移动焦点后,我的钩子回调不再被调用。 这种情况发生了我是快速还是慢速按Tab键的问题。 谁能解释一下究竟发生了什么? 下面是我写的代码。 我在Windows 7 64位上测试过它。 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Runtime.InteropServices; namespace HookTest { static class Program { private const int WH_CALLWNDPROC = 4; private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); private class MainForm : Form { private Button button1; private TextBox textBox1; public MainForm() […]

从闭源第三方Win32应用程序中的窗口捕获数据

我打算创建一个C#Windows Forms应用程序作为第三方Win32应用程序的扩展,但我现在对如何执行此操作感到困惑。 我得到的最远的是知道它涉及Win32 Hooking,并且有一个名为EasyHook的开源项目应该允许我这样做。 我想知道如何从文本框中获取文本或从第三方Win32应用程序中的控件获取其他数据。 当用户按下按钮时,将从外部应用程序的运行窗口捕获控件中的文本/数据。 我想问题可归纳如下: 当用户点击某个按钮时,如何确定要挂钩的事件? 如何在单击按钮时获取Win32控件显示的值?

如何拦截每个尝试在C#中使用API​​函数?

我需要阻止计算机上的任何屏幕捕获软件进行屏幕截图。 由于它们都是标准的API函数,我想我可以监视和阻止它们。 我需要使用C#。 我所发现的是如何在某个程序中监视和阻止它们(屏幕捕获程序)。 他们正在寻找程序中的一个函数,然后他们在我的函数地址上更改它的地址。 但是,如果我没有任何某些程序,我怎么能这样做呢? 我需要阻止任何试图截屏的人。

禁用特定GDI设备上下文的抗锯齿

我正在使用第三方库将图像渲染到GDI DC,我需要确保在没有任何平滑/抗锯齿的情况下渲染任何文本,以便我可以将图像转换为具有索引颜色的预定义调色板。 我用于渲染的第三方库不支持这个,只是根据字体渲染的当前窗口设置呈现文本。 他们还表示他们不太可能在短时间内添加切换抗锯齿function。 到目前为止,我发现的最好的工作是以这种方式调用第三方库(为简洁起见,error handling和先前的设置检查被省略): private static void SetFontSmoothing(bool enabled) { int pv = 0; SystemParametersInfo(Spi.SetFontSmoothing, enabled ? 1 : 0, ref pv, Spif.None); } // snip Graphics graphics = Graphics.FromImage(bitmap) IntPtr deviceContext = graphics.GetHdc(); SetFontSmoothing(false); thirdPartyComponent.Render(deviceContext); SetFontSmoothing(true); 这显然会对操作系统产生可怕的影响,其他应用程序会在每次渲染图像时从禁用类型闪烁到禁用和返回。 所以问题是,有谁知道如何改变特定DC的字体渲染设置? 即使我可以只更改进程或线程而不是影响整个操作系统,这将是向前迈出的一大步! (这样我就可以选择将这个渲染转换为一个单独的进程 – 无论如何都会在渲染后将结果写入磁盘) 编辑:我想补充一点,我不介意解决方案是否比一些API调用更复杂。 我甚至会对一个解决方案感到满意,如果只需要一天的工作就可以挂钩系统dll。 编辑:背景信息第三方库使用约70种颜色的调色板进行渲染。 在将图像(实际上是地图图块)渲染到DC之后,我将每个像素从其32位颜色转换回其调色板索引,并将结果存储为8bpp灰度图像。 这将作为纹理上传到video卡。 在渲染过程中,我重新应用调色板(也存储为纹理),并在video卡上执行像素着色器。 这允许我瞬间在不同的调色板之间切换和淡入淡出,而不需要重新生成所有需要的切片。 生成并上传所有瓷砖需要10-60秒才能获得典型的世界观。 编辑:将GraphicsDevice重命名为Graphics这个问题的上一个版本中的GraphicsDevice类实际上是System.Drawing.Graphics。 我已经重命名它(使用GraphicsDevice […]

挂钩SetConsoleCtrlHandler时没有堆栈跟踪的NullReferenceException

使用代码从这个线程挂钩控制台关闭事件,我有时会得到一个没有堆栈跟踪的NullReferenceException (大多数情况下我没有)。 它发生在发布和调试中,并且“抛出exception时中断”没有帮助(它中断,但堆栈跟踪仍为空)。 当我正常退出我的应用程序时,我从未得到这个exception(这是命中输入并因此释放Console.ReadLine )。 应用程序事件日志有2个条目: 应用程序:MyApp.exe Framework版本:v4.0.30319描述:由于未处理的exception,进程已终止。 exception信息:System.NullReferenceException Stack: 和: 故障应用程序名称:Gateway.exe,版本:1.0.0.0,时间戳:0x4e284101故障模块名称:未知,版本:0.0.0.0,时间戳:0x00000000exception代码:0xc0000005故障偏移:0x004d41ce故障进程id:0xf00故障应用程序启动时间:0x01cc47b827e19a6e错误应用程序路径:C:\ dev \ MyApp.exe错误模块路径:未知报告ID:689c1caa-b3ab-11e0-ba1b-00247e777f12 谷歌已经透露了SetConsoleCtrlHandler一些错误和问题 ,所以我想知道这是否是一场失败的战斗。

有没有办法在C#中挂钩托管函数,就像我在C ++中使用非托管函数一样?

在C ++中,我将得到函数的地址,并将前几个字节覆盖到jmp到我的函数,做一些事情,恢复原始字节,并调用原始函数。 我可以在C#中做这样的事吗?

找不到模块

我一直在研究这个问题并且没有更接近解决方案。 我再次挖出了我的旧版WindowsHookLib – 它可以在http://www.codeproject.com/KB/DLL/WindowsHookLib.aspx上获得 。 该库允许全局Windows鼠标/键盘/剪贴板挂钩,这是非常有用的。 我正在尝试使用此处的Mouse Hook捕获Mouse-Motion(我可以使用一个总是轮询Cursor.Position的Timer,但我打算稍后使用WindowsHookLib的更多function)。 代码如下: MouseHook mh = new MouseHook(); mh.InstallHook(); mh.MouseMove += new EventHandler(mh_MouseMove); 但是在调用InstallHook()时,我得到一个exception:“无法找到指定的模块”。 奇怪。 搜索,我发现有人认为这是因为DLL不在Windows PATH变量中包含的地方,并且因为将它放在system32中并没有帮助我将整个程序转换为C#以直接包含在我的项目(我很好奇它是如何工作的)。 但是这个错误是顽固不变的,所以我对此进行了一些挖掘,发现了负责的库中的代码:在InstallHook()中,我们有 IntPtr hinstDLL = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); this._hMouseHook = UnsafeNativeMethods.SetWindowsHookEx(14, this._mouseProc, hinstDLL, 0); if (this._hMouseHook == IntPtr.Zero) { throw new MouseHookException(new Win32Exception(Marshal.GetLastWin32Error()).Message); } 而这(在修改和重新编译之后)告诉我,我真正得到的是Windows错误“ERROR_MOD_NOT_FOUND”! 现在,我在这里难过。 我不是直接将Hook Library编译成我的项目吗? (UnsafeMethods.SetWindowsHookEx只是来自user32的DllImported方法) 任何答案,或正确方向的Prods,或任何提示,指针或类似的非常感谢!