C# 中的低级键盘挂钩

发布于 2024-11-26 23:23:10 字数 456 浏览 0 评论 0原文

我正在制作一个模块,可以通过键盘控制和移动平移和倾斜设备。 该模块是一个 C# .DLL,并使用反射通过其他模块动态加载。 该模块不能有任何形式(可见)。

我正在使用在 http: 上找到的代码: //blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx 用于低级别 kb 挂钩。 唯一的问题是它使用 consol 应用程序并调用 Application.Run() 来处理消息循环,这是挂钩正常工作所必需的。由于我有一个 .dll 而不是控制台应用程序,因此我无法使其工作并捕捉按下的按键。

问题: 如何替换对 Application.Run() 的调用来处理 .dll 中的消息循环以捕获 KB 挂钩?

谢谢!!!!

I'm making a module that will control and move pan and tilt device via KEYBOARD.
The module is a C# .DLL and being loaded dynamiclally via other module using reflection.
The module CAN NOT have any form (visible).

I'm using a code that I found on the http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx for a low level kb hook.
The only problem that is it uses consol application and calls Application.Run() to take care of a message loop, which is required for hooks to work properly. Since I'm having a .dll and not a console application, I can not make it to work and catch the keys pressed.

The question:
How can I replace the call for Application.Run() to take care of a message loop in the .dll to catch the KB hooks?

Thx!!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷清清 2024-12-03 23:23:10

对于消息循环,不需要控制台或 GUI - 它可以保持隐藏状态并拦截消息。

For a message-loop there is no need to have Console or GUI - it can remain hidden, and intercept messages.

莫言歌 2024-12-03 23:23:10

您的 DLL 应该使用加载它的程序中的消息循环。但是,如果这是不可能的,您可以让 DLL 启动一个新线程并从该线程内部调用 Application.Run() 并使用它自己的消息循环。

public static void InjectionPoint()
{
    Thread thread = new Thread(new ThreadStart(DLLMessageLoop));
    thread.IsBackground = true;
    thread.Start();
}

public static void DLLMessageLoop()
{
    _hookID = SetHook(_proc);
    Application.Run();
    UnhookWindowsHookEx(_hookID);
}

Your DLL should use the message loop from the program loading it. However if that is not possible you can have your DLL start a new thread and call Application.Run() from inside that thread and use it's own message loop.

public static void InjectionPoint()
{
    Thread thread = new Thread(new ThreadStart(DLLMessageLoop));
    thread.IsBackground = true;
    thread.Start();
}

public static void DLLMessageLoop()
{
    _hookID = SetHook(_proc);
    Application.Run();
    UnhookWindowsHookEx(_hookID);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文