C# 按键事件处理程序,但在没有窗体的windows应用程序上
我有一个与读卡器(磁条)相连的应用程序。当我有一个输出数据的表单或者在一个控制台应用程序中可以将数据输出到控制台时,我能够捕获卡上的数据 但在我正在开发的应用程序中,它有一个程序类作为启动程序,并以这种方式启动程序 我想我需要的是一个通用的按键侦听器,以便在刷卡时查找 我想我需要像KeyPressEventHandler这样的东西,但我的应用程序中似乎无法实现这一点 我创建了以下扩展方法:C# 按键事件处理程序,但在没有窗体的windows应用程序上,c#,C#,我有一个与读卡器(磁条)相连的应用程序。当我有一个输出数据的表单或者在一个控制台应用程序中可以将数据输出到控制台时,我能够捕获卡上的数据 但在我正在开发的应用程序中,它有一个程序类作为启动程序,并以这种方式启动程序 我想我需要的是一个通用的按键侦听器,以便在刷卡时查找 我想我需要像KeyPressEventHandler这样的东西,但我的应用程序中似乎无法实现这一点 我创建了以下扩展方法: public static class Utilities { private static
public static class Utilities
{
private static KeyPressEventHandler handler = KeyPressed;
public static void KeyPressed(Object sender, KeyPressEventArgs e)
{
while (true)
{
dataReceived.Append(e.KeyChar);
}
}
public static KeyPressEventHandler getKeyPressHandler()
{
return handler;
}
}
但是我不确定如何在我的Main()
方法中引用它。我没有看到按键的方法 一个示例(自.net framework 1.1以来我没有更新代码),在按下任何键时都会发生事件:
根据CLR和Windows的版本,您在使用Windows钩子时会遇到一些特定的问题
请参见CodeProject上的示例应用程序,该应用程序读取C#中的原始输入。您需要一个窗口来捕获密钥,或者您应该查看
SetWindowsHook
@JeroenvanLangen-您有没有关于如何在C#中执行此操作的示例?@webdad3您是否尝试过一个著名的网站,并提供了大量示例:?@BartoszKP-我整天都在寻找示例。但我明白你的意思。我今天累了。@webdad3提高编码性能的最好办法是休息一下,散散步;)也许这会有帮助:?
public class Hook
{
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
public static event Action Event = null;
private const int WH_KEYBOARD = 2;
private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
static int _hookKeyboard = 0;
private static HookProc _hookKeyboardProc;
public static bool Install()
{
_hookKeyboardProc = new HookProc(KeyboardHook);
_hookKeyboard = SetWindowsHookEx(WH_KEYBOARD, _hookKeyboardProc, IntPtr.Zero, GetCurrentThreadId());
return _hookKeyboard != 0;
}
public static bool Uninstall()
{
// uninstall keyboard hook
if(!UnhookWindowsHookEx(_hookKeyboard))
return false;
_hookMouseProc = null;
return true;
}
private static int KeyboardHook(int nCode, IntPtr wParam, IntPtr lParam)
{
// if any message - fire event
if(nCode >= 0 && Event != null)
Event();
return CallNextHookEx(_hookKeyboard, nCode, wParam, lParam);
}
}