C#在不同线程中接收键盘钩子回调

编程入门 行业动态 更新时间:2024-10-27 18:23:41
本文介绍了C#在不同线程中接收键盘钩子回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我写了一个程序。它通过SetWindowsHookEx挂钩用户输入。而且它运行得很好。

然后我想知道如何在不同的线程中实现WindowsHook,以便学习C#。

但我是新来的C#,所以找不到答案。

帮帮我。

谢谢。

编辑

这是我的InputHook类。某些代码已缩写。

public class InputHooker { public delegate IntPtr inputHookedDelegate(int nCode, IntPtr wParam, IntPtr lParam); public inputHookedDelegate keyHookHandler; public InputHooker() { keyHookHandler = onKeyHooked; } public void StartInputHook() { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { curKeyHookID = SetWindowsHookEx(WH_KEYBOARD_LL, keyHookHandler, GetModuleHandle(curModule.ModuleName), 0); } } private IntPtr onKeyHooked(int nCode, IntPtr wParam, IntPtr lParam) { return CallNextHookEx(curKeyHookID, nCode, wParam, lParam); } }

我尝试了如下代码;

MyInputHooker = new InputHooker(); Thread myInputHookThread = new Thread(new ThreadStart(MyInputHooker.StartInputHook)); myInputHookThread.Name = "UOCInputHookThread"; myInputHookThread.Priority = ThreadPriority.Normal; myInputHookThread.Start();

但它不起作用。(SetWindowsHookEx成功,但未在按下键盘时调用onKeyHosted。)相反,以下代码运行得很好。

MyInputHooker = new InputHooker(); MyInputHooker.StartInputHook(); 推荐答案

失败的原因可在此处的WinAPI文档中找到:

msdn.microsoft/en-us/library/ms644985(v=vs.85).aspx

此挂钩在安装它的线程的上下文中调用。 该调用是通过向安装 胡克。因此,安装挂钩的线程必须具有 消息循环。

发生的情况是,新创建的线程正在设置挂钩并立即退出,因此当Windows希望通过向该线程发送消息来调用挂钩过程时,它找不到它,因为它已经退出。

如果这只是出于学习目的,您可以通过在StartInputHook方法的末尾调用Application.Run在线程中放置一个消息泵。(至少我认为这会奏效--我自己还没有试过。)对于真正的代码,最好的做法是在主应用程序线程中调用SetWindowsHookEx。我假设您已经在它工作的情况下这样做了,并且应用程序的消息泵正在为您处理这件事。

老实说,如果这仅仅是为了学习C#,SetWindowsHookEx可能有点太高级了。使用它需要了解很多事情在幕后是如何工作的。

更多推荐

C#在不同线程中接收键盘钩子回调

本文发布于:2023-11-08 10:51:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1569177.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:钩子   线程   回调   键盘

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!