USBDetective

Log | Files | Refs | README | LICENSE

commit e674f98a714859263a1ace2e512771a478be1164
parent 9f596166e49b0847a7a4b42c3a3bec385d42f3ab
Author: William Lindholm <william_lindholm@outlook.com>
Date:   Fri, 29 Dec 2023 21:28:34 +0100

Implemented tkinter GUI.

Diffstat:
Mmain.py | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 75 insertions(+), 25 deletions(-)

diff --git a/main.py b/main.py @@ -1,29 +1,79 @@ import win32com.client +import pythoncom +import threading +import tkinter as tk +from tkinter import scrolledtext import time -def get_pnp_devices(): - wmi = win32com.client.GetObject("winmgmts:") - pnp_devices = wmi.InstancesOf("Win32_PnPEntity") - return {device.DeviceID: device.Name for device in pnp_devices} + +class USBDeviceDetector(threading.Thread): + def __init__(self, update_callback): + super().__init__() + self.update_callback = update_callback + self.devices_before = self.get_pnp_devices() + self.running = True + + def get_pnp_devices(self): + pythoncom.CoInitialize() # Initialize COM in the thread + wmi = win32com.client.GetObject("winmgmts:") + pnp_devices = wmi.InstancesOf("Win32_PnPEntity") + devices = {device.DeviceID: device.Name for device in pnp_devices} + pythoncom.CoUninitialize() # Uninitialize COM + return devices + + def run(self): + while self.running: + time.sleep(1) + devices_now = self.get_pnp_devices() + new_devices = devices_now.keys() - self.devices_before.keys() + removed_devices = self.devices_before.keys() - devices_now.keys() + + # Update the GUI if there are changes + if new_devices or removed_devices: + self.update_callback(new_devices, removed_devices) + + self.devices_before = devices_now + + def stop(self): + self.running = False + + +class USBDeviceLoggerGUI: + def __init__(self, root): + self.root = root + root.title("USB Device Logger") + + # Create a ScrolledText widget for logging device changes + self.log = scrolledtext.ScrolledText(root, state='disabled', width=70, height=20) + self.log.grid(row=0, column=0, padx=10, pady=10) + + # Start the USB device detection in a separate thread + self.detector = USBDeviceDetector(self.log_device_changes) + self.detector.start() + + def log_device_changes(self, new_devices, removed_devices): + message = "" + for device_id in new_devices: + message += f"Connected: {device_id}\n" + for device_id in removed_devices: + message += f"Disconnected: {device_id}\n" + + # Update the log widget with the detected changes + if message: + self.log.configure(state='normal') + self.log.insert(tk.END, message) + self.log.configure(state='disabled') + self.log.yview(tk.END) + + def on_close(self): + # Ensure thread is properly stopped before closing the GUI + self.detector.stop() + self.detector.join() + self.root.destroy() + if __name__ == '__main__': - devices_before = get_pnp_devices() - print("Waiting for PnP device change...") - while True: - time.sleep(1) # Adding a delay to reduce CPU usage - devices_now = get_pnp_devices() - - new_devices = devices_now.keys() - devices_before.keys() - removed_devices = devices_before.keys() - devices_now.keys() - - if new_devices: - print("New PnP devices detected:") - for device_id in new_devices: - print(devices_now[device_id]) - - if removed_devices: - print("PnP devices removed:") - for device_id in removed_devices: - print(devices_before[device_id]) - - devices_before = devices_now -\ No newline at end of file + root = tk.Tk() + gui = USBDeviceLoggerGUI(root) + root.protocol("WM_DELETE_WINDOW", gui.on_close) + root.mainloop() +\ No newline at end of file