2011-07-28 105 views
1

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

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

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

Thx !!!!

回答

0

您的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); 
} 
0

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