4.5 KiB
Global Input Capture Implementation Summary
Problem Solved
The NFC Network Client was losing NFC scans when the window lost focus. Users had to keep the window focused for it to detect scans, which was inconvenient.
Solution Implemented
Implemented global keyboard capture using the pynput library, allowing the client to capture NFC scans regardless of window focus state.
Changes Made
1. Updated nfc_network_client.py (v1.1.0)
Key Changes:
- Added
pynput.keyboardintegration for system-wide input capture - Implemented
keyboard.Listenerthat runs in a background thread - Added
start_keyboard_listener()andstop_keyboard_listener()methods - Modified
on_key_press()to handle global keyboard events - Added UI status panel showing "Global Input Capture" state
- Proper cleanup on application shutdown
Technical Implementation:
self.keyboard_listener = keyboard.Listener(on_press=self.on_key_press)
self.keyboard_listener.start()
The listener captures all keyboard input system-wide and filters for NFC scan patterns (character accumulation followed by Enter key).
2. Created client_requirements.txt
New dependency file specifically for the client:
pynput>=1.7.6(required for global input capture)requests>=2.31.0(HTTP client)tkinter-tooltip>=2.2.0(optional GUI enhancement)typing-extensions>=4.5.0(type hints support)
3. Updated start_nfc_client.bat
Enhanced launcher with:
- Automatic dependency checking for
pynput - Auto-installation if missing
- Clear messaging about global input capture capability
- Graceful error handling
4. Created UPDATE_GUIDE.md
Comprehensive documentation including:
- Feature explanation
- Installation instructions
- Technical details
- Troubleshooting guide
- Compatibility information
User Experience Improvements
Before (v1.0.0)
❌ Had to keep client window focused ❌ Scans lost when clicking other windows ❌ Couldn't minimize the client ❌ Annoying to keep on top
After (v1.1.0)
✅ Works when minimized ✅ Works when using other programs ✅ Works when browsing/gaming ✅ Can run quietly in background ✅ Visual indicator of capture state
Installation Steps for Users
- Pull latest from Gitea
- Install new dependency:
Or use the requirements file:
pip install pynputcd clients pip install -r client_requirements.txt - Run the updated client:
start_nfc_client.bat
The launcher automatically checks for and installs pynput if needed.
Technical Architecture
User Scans NFC Tag
↓
NFC Reader (keyboard emulation)
↓
pynput.keyboard.Listener (global capture)
↓
on_key_press() event handler
↓
Character accumulation + Enter detection
↓
complete_scan() validates and sends
↓
HTTP POST to server /api/nfc_scan
↓
Server plays content
Platform Compatibility
| Platform | Status | Notes |
|---|---|---|
| Windows 10/11 | ✅ Full Support | Works out of the box |
| Linux (X11) | ✅ Full Support | Works out of the box |
| Linux (Wayland) | ⚠️ May Need Setup | Accessibility permissions may be required |
| macOS | ✅ Full Support | Requires accessibility permissions |
Testing Recommendations
- Focus Test: Start client, click another window, scan NFC tag
- Minimize Test: Minimize client, scan NFC tag
- Background Test: Open browser/game, scan NFC tag
- Multiple Scan Test: Perform rapid sequential scans
- Connection Test: Ensure scans still forward to server
Known Considerations
- Privacy: Global keyboard capture is powerful - code is open source for transparency
- Permissions: Some systems may prompt for accessibility permissions (macOS, some Linux)
- Performance: Minimal overhead - listener only processes keyboard events
- Security: Listener is isolated to the client process and only processes during active scans
Files Modified/Created in Gitea
✅ clients/nfc_network_client.py (updated)
✅ clients/client_requirements.txt (new)
✅ clients/start_nfc_client.bat (updated)
✅ clients/UPDATE_GUIDE.md (new)
Version Bump
- Previous: v1.0.0
- Current: v1.1.0
Maintenance Notes
- The
pynputlibrary is actively maintained and stable - No additional system dependencies required on Windows
- Linux may need
python3-xlibfor X11 (usually pre-installed) - Global listener automatically stops when application closes
Enjoy hassle-free NFC scanning! 🎬