Как я могу подключить только скрытую клавиатуру для чтения клавиш, как кейлоггер? (Сканер штрих-кода) - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь заставить слушателя читать данные, которые поступают с моего сканера штрих-кода. Я сделал кейлоггер, но он ловит клавиши, которые приходят с клавиатуры моего ноутбука и сканера штрих-кода.Я хочу поймать данные, которые приходят только мой сканер штрих-кода.Я не знаю, как я могу это сделать, чтобы любое предложение могло помочь мне.

Вот моя функция SetHook, может быть, кто-то знает, как мне сфокусироваться, чтобы спрятаться при редактировании этой функции.

private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
  using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
      {
        return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
      }
}

1 Ответ

0 голосов
/ 16 июня 2019

Ниже приведен код, который я написал для той же проблемы.Код работает следующим образом:

В HookHandleProc он ожидает сброса следующих клавиш менее чем за 50 мс

private const Keys HK_PRE = Keys.F5;  //0x0007;
private const Keys HK_PRE_VALID = Keys.OemOpenBrackets;

Если это будет сделано, тогда мы устанавливаем _hookFlag = true, поэтому сновав HookHandleProc мы заглатываем ключи в _buffer до

private const Keys HK_SUFF = Keys.Oemtilde; //0x000A;

Так что, если вы запрограммируете свое устройство считывания штрих-кода , чтобы оно включало эти значения префикса и суффикса , вы можете знать, гдеданные поступают от

Вот код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using Keys = System.Windows.Forms.Keys;

namespace BarcodeScanner
{
public class CouldntHookException : Exception
{
    public override string Message
    {
        get
        {
            return "barcode_input_handler couldnt add itself to the hook chain.";
        }
    }

    public override string ToString()
    {
        return Message;
    }
}


public class BarcodeHandler : IDisposable
{
    private delegate long delLowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    public delegate void delInput(string scanCode);

    public event delInput InputEvent;

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern long SetWindowsHookEx(int idHook,
        delLowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(long hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern long CallNextHookEx(long hhk, int nCode,
        IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);



    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private const Keys HK_PRE = Keys.F5;  //0x0007;
    private const Keys HK_PRE_VALID = Keys.OemOpenBrackets;
    private const Keys HK_SUFF = Keys.Oemtilde; //0x000A;
    private long _hHook = 0;
    private StringBuilder _buffer;
    private bool _hookFlag;
    private bool _hookValid;
    delLowLevelKeyboardProc _procHook;
    taglParam _lastKey;

    struct taglParam
    {
        public int _vkCode, _scanCode, _flags, _time;

        public taglParam(int vkCode, int scanCode, int flags, int time)
        { _vkCode = vkCode; _scanCode = scanCode; _flags = flags; _time = time; }
    };

    public BarcodeHandler()
    {
        _buffer = new StringBuilder(128);
        _hookFlag = false;
        _hookValid = false;

        _procHook = new delLowLevelKeyboardProc(HookHandleProc);
        _hHook = SetHook();

        if (_hHook == 0)
            throw new CouldntHookException();
    }

    ~BarcodeHandler()
    {
        Dispose();
    }

    private long SetHook()
    {

        using (Process cp = Process.GetCurrentProcess())
        using (ProcessModule cm = cp.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, _procHook,
                GetModuleHandle(cm.ModuleName), 0);
        }
    }

    private long HookHandleProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode < 0 || wParam != (IntPtr)WM_KEYDOWN)
            return CallNextHookEx(_hHook, nCode, wParam, lParam);

        taglParam lp = (taglParam)Marshal.PtrToStructure(lParam, typeof(taglParam));

        if (_hookFlag)
        {
            if ((Keys)lp._vkCode == HK_SUFF)
            {
                _hookFlag = false;
                _hookValid = false;
                //trigger event here
                //use begininvoke instead of invoke  ;)
                InputEvent.Invoke(_buffer.ToString());
                return -1;
            }

            _buffer.Append((char)lp._vkCode);
            return -1;
        }
        else if ((Keys)lp._vkCode == HK_PRE)
        {
            _hookValid = true;
            _lastKey = lp;
        }
        else if (_hookValid && (Keys)lp._vkCode == HK_PRE_VALID)
        {
            if (lp._time - _lastKey._time < 50)
            {
                _buffer.Clear();
                _hookFlag = true;
                return -1;
            }
            else
                _hookValid = false;
        }


        return CallNextHookEx(_hHook, nCode, wParam, lParam);
    }

    private bool DeleteHook()
    {
        return UnhookWindowsHookEx(_hHook);
    }

    public void Dispose()
    {
        DeleteHook();

        GC.SuppressFinalize(this);
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...