Mensajes: 23
Temas: 8
Registro en: Sep 2020
Reputación:
0
13-09-2020, 10:34 PM
(Última modificación: 13-09-2020, 10:55 PM por JoAnCa.)
Hola a todos
Pues me estoy iniciando en python, y quiero migrar algunas aplicaciones que tengo en delphi para python, pero no se como se hacen algunas cosas, entre ellas el titulo del post
Necesito detectar cuando se inserta una memoria usb, y obtener su numero de serie (id unico), nombre, capacidad y letra de unidad, para despues guardar esos datos en una base de datos mysql
¿ Como podré hacer esto en python 3.8?
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola, bienvenido.
Acá tenés algunas opciones: https://stackoverflow.com/questions/4749...-on-python.
Saludos!
Mensajes: 23
Temas: 8
Registro en: Sep 2020
Reputación:
0
(14-09-2020, 11:39 PM)Francisco escribió: Hola, bienvenido.
Acá tenés algunas opciones: https://stackoverflow.com/questions/4749...-on-python.
Saludos!
Gracias por tu respuesta
Me sirve para la parte de ejecución en segundo plano,
pero para lo de detectar la inserción de un disp usb, no me convence aun lo de hacer un cheque cada cierto tiempo por un cambio, ya que delphi intercepta los mensajes de windows para eso, solo es estar a la escucha de ese mensaje para saber que se inserto un dispositivo usb
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola. Podríamos intentar una solución usando la API de Windows, pero no creo que el procedimiento sea muy diferente. Seguramente se trate de instalar un hook y escuchar a determinado evento con un bucle, con lo cual vas a estar en la misma situación que ahora. (De cualquier manera ese bucle se puede mover a otro hilo). ¿Cómo lo estás haciendo en Delphi? Capaz podemos portar ese código.
Saludos
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Dejo un código que hace justamente lo que estás buscando usando la API de Windows:
Código: # Demo RegisterDeviceNotification etc. Creates a hidden window to receive
# notifications. See serviceEvents.py for an example of a service doing
# that.
import sys, time
import win32gui, win32con, win32api, win32file
import win32gui_struct, winnt
# These device GUIDs are from Ioevent.h in the Windows SDK. Ideally they
# could be collected somewhere for pywin32...
GUID_DEVINTERFACE_USB_DEVICE = "{A5DCBF10-6530-11D2-901F-00C04FB951ED}"
# WM_DEVICECHANGE message handler.
def OnDeviceChange(hwnd, msg, wp, lp):
# Unpack the 'lp' into the appropriate DEV_BROADCAST_* structure,
# using the self-identifying data inside the DEV_BROADCAST_HDR.
info = win32gui_struct.UnpackDEV_BROADCAST(lp)
print("Device change notification:", wp, str(info))
if wp==win32con.DBT_DEVICEQUERYREMOVE and info.devicetype==win32con.DBT_DEVTYP_HANDLE:
# Our handle is stored away in the structure - just close it
print("Device being removed - closing handle")
win32file.CloseHandle(info.handle)
# and cancel our notifications - if it gets plugged back in we get
# the same notification and try and close the same handle...
win32gui.UnregisterDeviceNotification(info.hdevnotify)
return True
def TestDeviceNotifications(dir_names):
wc = win32gui.WNDCLASS()
wc.lpszClassName = 'test_devicenotify'
wc.style = win32con.CS_GLOBALCLASS|win32con.CS_VREDRAW | win32con.CS_HREDRAW
wc.hbrBackground = win32con.COLOR_WINDOW+1
wc.lpfnWndProc={win32con.WM_DEVICECHANGE:OnDeviceChange}
class_atom=win32gui.RegisterClass(wc)
hwnd = win32gui.CreateWindow(wc.lpszClassName,
'Testing some devices',
# no need for it to be visible.
win32con.WS_CAPTION,
100,100,900,900, 0, 0, 0, None)
hdevs = []
# Watch for all USB device notifications
filter = win32gui_struct.PackDEV_BROADCAST_DEVICEINTERFACE(
GUID_DEVINTERFACE_USB_DEVICE)
hdev = win32gui.RegisterDeviceNotification(hwnd, filter,
win32con.DEVICE_NOTIFY_WINDOW_HANDLE)
hdevs.append(hdev)
# and create handles for all specified directories
for d in dir_names:
hdir = win32file.CreateFile(d,
winnt.FILE_LIST_DIRECTORY,
winnt.FILE_SHARE_READ | winnt.FILE_SHARE_WRITE | winnt.FILE_SHARE_DELETE,
None, # security attributes
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS | # required privileges: SE_BACKUP_NAME and SE_RESTORE_NAME.
win32con.FILE_FLAG_OVERLAPPED,
None)
filter = win32gui_struct.PackDEV_BROADCAST_HANDLE(hdir)
hdev = win32gui.RegisterDeviceNotification(hwnd, filter,
win32con.DEVICE_NOTIFY_WINDOW_HANDLE)
hdevs.append(hdev)
# now start a message pump and wait for messages to be delivered.
print("Watching", len(hdevs), "handles - press Ctrl+C to terminate, or")
print("add and remove some USB devices...")
if not dir_names:
print("(Note you can also pass paths to watch on the command-line - eg,")
print("pass the root of an inserted USB stick to see events specific to")
print("that volume)")
while 1:
win32gui.PumpWaitingMessages()
time.sleep(0.01)
win32gui.DestroyWindow(hwnd)
win32gui.UnregisterClass(wc.lpszClassName, None)
if __name__=='__main__':
# optionally pass device/directory names to watch for notifications.
# Eg, plug in a USB device - assume it connects as E: - then execute:
# % win32gui_devicenotify.py E:
# Then remove and insert the device.
TestDeviceNotifications(sys.argv[1:])
Requiere pywin32 (pip install pywin32). Es uno de los demos de ese paquete: https://github.com/mhammond/pywin32/blob...enotify.py.
Saludos!
Mensajes: 23
Temas: 8
Registro en: Sep 2020
Reputación:
0
17-09-2020, 11:38 AM
(Última modificación: 17-09-2020, 10:50 PM por Francisco.)
(16-09-2020, 09:30 PM)Francisco escribió: Dejo un código que hace justamente lo que estás buscando usando la API de Windows:
....
Requiere pywin32 (pip install pywin32). Es uno de los demos de ese paquete: https://github.com/mhammond/pywin32/blob...enotify.py.
Saludos!
Muchas gracias amigo
En delphi lo hice mas o menos asi de esa forma.
Probare el codigo que me comentas y despues te cuento como me fue
|