Printer Event Handler
A cross-platform Rust library for monitoring printer status and events on Windows and Linux systems.
Features
- Cross-platform support - Works on Windows (WMI) and Linux (CUPS)
- Real-time monitoring - Monitor printer status changes with customizable intervals (millisecond precision)
- Printer discovery - List and find printers on your system
- Async/await support - Built on Tokio for efficient asynchronous operations
- Type-safe - Strongly typed printer status and error states
- Library + CLI - Use as a library in your projects or as a standalone CLI tool
Quick Start
As a Library
Add this to your Cargo.toml:
[]
= "1.4.0"
= { = "1.0", = ["full"] }
Basic Usage
use ;
async
Monitor Printer Status Changes
use PrinterMonitor;
async
Find Specific Printer
use PrinterMonitor;
async
Check for Changes
use PrinterMonitor;
use ;
async
Advanced Property Monitoring
The library supports detailed property-level monitoring to detect specific changes:
use PrinterMonitor;
async
Monitor Specific Properties
The library provides type-safe property monitoring using the MonitorableProperty enum:
use ;
async
Available Properties to Monitor
The MonitorableProperty enum provides type-safe access to all monitorable printer properties:
Multiple Printer Monitoring
// Monitor multiple printers concurrently
let printer_names = vec!;
monitor.monitor_multiple_printers.await?;
Millisecond Precision Intervals
All monitoring functions accept intervals in milliseconds, providing precise control over monitoring frequency:
// High-frequency monitoring (every 100ms)
monitor.monitor_printer.await?;
// Standard monitoring (every 5 seconds)
monitor.monitor_printer.await?;
// Low-frequency monitoring (every 2 minutes)
monitor.monitor_printer.await?;
Common Intervals:
100= 100ms (0.1 seconds) - High frequency500= 500ms (0.5 seconds) - Responsive1000= 1 second - Standard5000= 5 seconds - Moderate30000= 30 seconds - Conservative60000= 1 minute - Low frequency
CLI Usage
The crate also provides a command-line interface:
# Install from crates.io
# Or run directly from source
List All Printers
Output:
Printer Status Checker
======================
Found 3 printer(s):
Printer #1: HP LaserJet Pro MFP M428f
Status: Idle
Error State: No Error
Offline: No
Default Printer: Yes
Printer #2: HPDC7777 (HP Smart Tank 580-590 series)
Status: Offline
Error State: Service Requested
Offline: Yes
Printer #3: Microsoft Print to PDF
Status: Idle
Error State: No Error
Offline: No
Monitor a Specific Printer
Output:
Printer Status Monitor Service
==============================
Monitoring printer 'HP LaserJet Pro' every 60 seconds...
Press Ctrl+C to stop
[2024-01-15 14:30:15] Printer 'HP LaserJet Pro' Initial Status:
Status: Idle
Error State: No Error
Offline: No
[2024-01-15 14:31:15] Checking printer 'HP LaserJet Pro'
[2024-01-15 14:32:15] Printer 'HP LaserJet Pro' Status Changed:
Status: Idle -> Printing
Error State: No Error -> No Error
Offline: No
[2024-01-15 14:33:15] Printer 'HP LaserJet Pro' Status Changed:
Status: Printing -> Busy
Error State: No Error -> No Error
Offline: No
Platform Support
| Platform | Backend | Requirements | Coverage |
|---|---|---|---|
| Windows | WMI (Windows Management Instrumentation) | None (built-in) | Complete Win32_Printer support - Full .NET PrintQueueStatus flag support (values like 1024, 16384) and 12 DetectedErrorState values (0-11) https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-printer |
| Linux | CUPS (Common Unix Printing System) | cups-client package recommended |
Basic status detection (idle, printing, offline) with CUPS integration |
Linux Setup
On Ubuntu/Debian:
On RHEL/CentOS/Fedora:
API Reference
Core Types
PrinterMonitor- Main entry point for all printer operationsPrinter- Represents a printer with complete WMI information and current stateMonitorableProperty- Type-safe enum for specifying properties to monitorPrinterStatus- Printer status enum (current property, values 1-7)PrinterState- Printer state enum (.NET PrintQueueStatus flags like 1024, 16384)ErrorState- Error condition enum (NoError, Jammed, NoPaper, etc.)PrinterError- Error type for all operations
Complete WMI Property Access
The Printer struct provides comprehensive access to all Win32_Printer WMI properties:
Raw Status Code Methods
// Get numeric WMI status codes
printer.printer_status_code // Option<u32> - PrinterStatus (1-7)
printer.printer_state_code // Option<u32> - PrinterState (.NET PrintQueueStatus flags)
printer.detected_error_state_code // Option<u32> - DetectedErrorState (0-11)
printer.extended_printer_status_code // Option<u32> - ExtendedPrinterStatus
printer.extended_detected_error_state_code // Option<u32> - ExtendedDetectedErrorState
printer.wmi_status // Option<&str> - Status property
Human-Readable Description Methods
// Get human-readable descriptions for status codes
printer.printer_status_description // Option<&'static str>
printer.printer_state_description // Option<&'static str>
printer.detected_error_state_description // Option<&'static str>
printer.extended_printer_status_description // Option<&'static str>
WMI Status Values
The wmi_status() method returns the WMI Status property with values like:
"OK"- Normal functioning"Degraded"- Functioning but with issues"Error"- Has problems"Unknown"- Cannot determine status"No Contact"- Communication lost- And others per Microsoft documentation
Example: Detailed Printer Analysis
let printer = monitor.find_printer.await?.unwrap;
// Processed high-level information
println!;
println!;
println!;
// Raw WMI analysis
println!;
if let Some = printer.printer_status_code
if let Some = printer.extended_printer_status_code
if let Some = printer.wmi_status
Printer Status Values
The library provides comprehensive support for all Win32_Printer states:
PrinterStatus (Current Property, Values 1-7)
PrinterState (.NET PrintQueueStatus Flags)
Based on .NET System.Printing.PrintQueueStatus:
Note: The PrinterState values are bitwise flags, so multiple states can be active simultaneously. The library automatically selects the most significant/priority state for display.
Error States
Complete support for Win32_Printer DetectedErrorState values:
Examples
Check out the examples directory for comprehensive usage patterns with complete WMI property access:
basic_listing.rs- List all printers with detailed WMI informationmonitor_changes.rs- Monitor status changes with WMI detailsproperty_monitoring.rs- Advanced property-level change detectionerror_handling.rs- Proper error handling and graceful degradationasync_patterns.rs- Advanced async usage and concurrent monitoring
Running Examples
Examples have their own Cargo.toml to keep the main library lightweight:
Or from the main directory:
Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
Development
# Clone the repository
# Run tests
# Check formatting
# Run linter
# Build documentation
License
This project is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Changelog
See CHANGELOG.md for details about changes in each version.