package com.topsun.posclient.common.core; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinUser; import com.sun.jna.platform.win32.WinDef.HMODULE; import com.sun.jna.platform.win32.WinDef.LRESULT; import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinUser.HHOOK; import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; import com.sun.jna.platform.win32.WinUser.MSG; /** * */ public class ScanBarcodeService { private HHOOK hhkKeyBoard; private final User32 lib = User32.INSTANCE; /** */ public void stopScanBarcodeService() { lib.UnhookWindowsHookEx(hhkKeyBoard); } /** */ public void startScanBarcodeService() { final BarcodeKeyboardListener listener=new BarcodeKeyboardListener(); LowLevelKeyboardProc keyboardHook = new LowLevelKeyboardProc() { @Override public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { if (nCode >= 0) { switch (wParam.intValue()) { case WinUser.WM_KEYUP: int keyCode = info.vkCode; if (keyCode >= 48 && keyCode <= 57) { listener.onKey(keyCode); } if (keyCode == 13) { listener.onKey(keyCode); } break; } } return lib.CallNextHookEx(hhkKeyBoard, nCode, wParam, info.getPointer()); } }; HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); hhkKeyBoard = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0); int result; MSG msg = new MSG(); while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { if (result == -1) { System.err.println("error in get message"); break; } else { System.out.println(msg.message); lib.TranslateMessage(msg); lib.DispatchMessage(msg); } } } }