Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有方法捕获dll中的键盘事件?_C#_Events_Dll - Fatal编程技术网

C# 是否有方法捕获dll中的键盘事件?

C# 是否有方法捕获dll中的键盘事件?,c#,events,dll,C#,Events,Dll,当用户按下键盘上的一些键时,我需要执行一个特定的代码 到目前为止没有什么困难,我应该在dll项目类型、类库中执行此操作,并且不使用任何特定的windows窗体控件 这能实现吗,如果是,请给我一些例子或学习材料 谢谢。您是否正在寻找一个?您可以使用键获取全局键盘输入。由于在C#中执行此操作将要求您以P/调用本机API中的几乎所有功能,因此您最好使用C/C++编写DLL并删除.NET依赖项。不,除非您希望从Windows窗体控件捕获关键事件,否则无法使用托管代码库完成此操作(System.Windo

当用户按下键盘上的一些键时,我需要执行一个特定的代码

到目前为止没有什么困难,我应该在dll项目类型、类库中执行此操作,并且不使用任何特定的windows窗体控件

这能实现吗,如果是,请给我一些例子或学习材料


谢谢。

您是否正在寻找一个?

您可以使用键获取全局键盘输入。由于在C#中执行此操作将要求您以P/调用本机API中的几乎所有功能,因此您最好使用C/C++编写DLL并删除.NET依赖项。

不,除非您希望从Windows窗体控件捕获关键事件,否则无法使用托管代码库完成此操作(

System.Windows.Forms.Control
)否则,您将不得不导入本机代码来处理键盘事件钩子。

没有办法,即使用p/Unjk在C语言中编写全局钩子,只需要低级键盘和鼠标钩子。因此,您可能可以调用/调用整个钩子,或者只调用一个自编写的C++ DLL,但无论如何它都有很多工作。 我会想办法用热键做你想做的事,这样你就不需要钩子了


祝你好运,Alex

你可以使用
GetKeyboardState
API函数

[DllImport ("user32.dll")]
public static extern int GetKeyboardState( byte[] keystate );


private void Form1_KeyDown( object sender, KeyEventArgs e )
{
   byte[] keys = new byte[255];

   GetKeyboardState (keys);

   if( keys[(int)Keys.Up] == 129 && keys[(int)Keys.Right] == 129 )
   {
       Console.WriteLine ("Up Arrow key and Right Arrow key down.");
   }
}

因为所有钩子函数都是从原生Windows API中调用的,所以在C++中写DLL的意义是什么?@ SLVIK262,因为.NET没有提供类似的功能。我的意思是,与C/C++不同的是,您可以编写所有相同的代码,几乎是行的,在C++中。DLL不依赖于.NETFramework,将是非常快,而且不必通过托管语言调用本机调用。@slavik262,OP可能正在寻找一种从托管应用程序中使用此DLL的方法。如果您使用非托管代码编写此DLL,则必须执行P/invoke才能使用它。是的,但您只需执行一个P/invoke来设置挂钩和另一个在.NET中编写钩子本身需要在每次击键时调用本机功能(对于
CallNextHookEx
)。