处理和阻止来自特殊键盘的输入

时间:2015-10-30 07:35:45

标签: c++ winapi raw-input keyboard-hook

我有两个设备,一个条形码扫描仪和一个键盘,通过USB连接到我的电脑。我的目标是阅读Barcode-Scanner的所有输入并使用我的程序处理。此外,应该为操作系统阻止扫描仪的输入。

我在这个主题上发现了一篇很好的文章: 组合原始输入和键盘钩子以选择性地阻止来自多个键盘的输入

通过这种方法,我可以为我的程序获取输入(以及来自哪个设备的输入)并为操作系统阻止它,就像我想要的那样。但这种方法非常复杂,因为它只适用于inputEvents和Hooks的组合。 Hook用于阻止OS的数据。 问题在于无法判断Hook来自哪个设备。

我的问题是:有没有人知道阻止来自特殊键盘输入的另一种方法,这种键盘不能与inputEvents和Hooks的这种组合一起使用?或者也许有可能告诉Hook来自哪个设备?

2 个答案:

答案 0 :(得分:-2)

我使用timer.tick 为numpadkeys创建数组并循环遍历

GetAsyncKeyState(VK_LBUTTON) 

,否则 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646290(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms646298(v=vs.85).aspx

How to Check if User input is from Barcode Scanner or Keyboard?

使用RAW Input API相对容易。

看看“在WinForms中区分条形码扫描器与键盘”

我有一个程序可以读取3个不同的USB扫描仪,并将输入重定向到3个不同的“通道”进行处理。代码有点广泛,所以我不在这里发布。如果您愿意,我可以粘贴一些块或通过电子邮件发送给您项目。

作为进口的线索:

#region Raw Input API

[DllImport( "User32.dll" )]
extern static uint GetRawInputDeviceList( IntPtr pRawInputDeviceList, ref uint uiNumDevices, uint cbSize );

[DllImport( "User32.dll" )]
extern static uint GetRawInputDeviceInfo( IntPtr hDevice, uint uiCommand, IntPtr pData, ref uint pcbSize );

[DllImport( "User32.dll" )]
extern static bool RegisterRawInputDevices( RAWINPUTDEVICE[ ] pRawInputDevice, uint uiNumDevices, uint cbSize );

[DllImport( "User32.dll" )]
extern static uint GetRawInputData( IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader );

#endregion

将InputDevice添加到项目后,您可以通过以下方式收听事件:

//创建一个新的InputDevice对象并注册InputDevice KeyPressed事件处理程序。

input_dev = new InputDevice( Handle );
input_dev.KeyPressed += new InputDevice.DeviceEventHandler( m_KeyPressed );

The event handler m_KeyPressed lets you to distinguish your devices through e.Keyboard.SubClass

    private void m_KeyPressed( object sender, InputDevice.KeyControlEventArgs e )
    {
        // e.Keyboard.SubClass tells you where from the event came.
        // e.Keyboard.key gives you the input data.
    }

希望有所帮助。

答案 1 :(得分:-3)

如果您阅读我的第一个链接。

<!DOCTYPE html>
<html>
<head>
........
$.ajax({
        type: "POST",
        url: "<?php echo base_url(); ?>" + "dashboard/show_data",
        cache: false,
        dataType: "json", 
        success: function(data){

        $('#demo').html(data);
........
<script src="http://js.nicedit.com/nicEdit-latest.js" type="text/javascript"></script>
<script type="text/javascript">bkLib.onDomLoaded(nicEditors.allTextAreas);</script>
</head>
<body>
    <textarea>Easy! You should check out MoxieManager!</textarea>
    <section id="demo">
    </section>
</body>
</html>

https://pusher.com https://msdn.microsoft.com/en-us/library/windows/desktop/hh448799(v=vs.85).aspx 并且可以使用vbcrlf

拆分来自扫描仪的数据

POS for .NET | Differentiate between (barcode) scanner and keyboard input