Comienza el Monitor
Archivo nuevo: C:\Users\compualarma\AppData\Roaming\Microsoft\Windows\Recent\esca.lnkArchivo borrado: C:\Users\compualarma\Desktop\esca.txtArchivo nuevo: C:\Users\compualarma\Desktop\esca.txtC:\Users\compualarma\Desktop\esca.txtArchivo borrado: C:\Users\compualarma\Desktop\esca.txtArchivo nuevo: C:\Users\compualarma\Desktop\esca.txtC:\Users\compualarma\Desktop\esca.txt
Monitorizando el Shell sólo con la API
#21
Escrito 19 septiembre 2015 - 01:03
#22
Escrito 19 septiembre 2015 - 03:51
Vale, el Monitor funciona como se esperaba. El notepad ha escrito el archivo y el monitor lo ha detectado bien. Pienso que es un problema de usuario. El Shell no es informado cuando un programa "ejecutado como" otro usuario realiza cambios el el sistema de archivos. Esto lo puedes comprobar arrancando una copia de explorer.exe ejecutado como otro usuario. Puedes experimentar abriendo una consola y en ella ejecutas lo siguiente:
runas /user:otro_usuario "explorer.exe /separate"
La nueva shell abierta es del otro_usuario. Si en ella borras un archivo, te darás cuenta que no recibe la notificación y el archivo, aunque borrado, sigue apareciendo hasta que pulsas F5 y se actualiza.
Investiga como se está ejecutando ese programa de llamadas telefónicas, si tiene un servicio, etc...
Saludos.
#23
Escrito 20 septiembre 2015 - 12:32
He verificado que estan abiertas con el mismo usuario. No veo ningun servicio que corresponda a este programa y aun asi no detecta nada.
luego lo probare con otra computadora para verificar. Mientras será poner un timer que revise el directorio correspondiente y compararlo con el ultimo archivo grabado.
#24
Escrito 20 septiembre 2015 - 12:44
Este el el código:
procedure TDirMonitor.ScanNotification2(Dir: WideString); var hDir: THANDLE; Filter: DWORD; BytesReturned: DWORD; begin ZeroMemory(@OVL, sizeof(OVERLAPPED)); hDir:= CreateFileW(PWCHAR(Dir), FILE_LIST_DIRECTORY, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0); Filter:= FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_CREATION or FILE_ACTION_ADDED or FILE_ACTION_REMOVED or FILE_ACTION_MODIFIED; SizeFI:= 1024; FI:= AllocMem(SizeFI); OVL.hEvent:= CReateEvent(nil, true, false, nil); BytesReturned:= 0; while not Terminated and ReadDirectoryChangesW(hDir, FI, SizeFI, false, Filter, @BytesReturned, @OVL, nil) do begin GetOverlappedResult(hDir, OVL, BytesReturned, TRUE); ResetEvent(OVL.hEvent); if BytesReturned > 0 then Synchronize(SetNotify); end; FreeMem(FI); FI:= nil; CloseHandle(hDir); CloseHandle(OVL.hEvent); end;
Te subo un adunto para pruebas.
Saludos.
Archivos adjuntos
#25
Escrito 21 septiembre 2015 - 09:16
Si le Pongo la Ruta completa del directorio funciona perfecto:
esta es la ruta que puse: C:\U2_V3.11\usb-record\2015\09\21
File added: 2015-09-21_10-24-33_000.mp3
File modified: 2015-09-21_10-24-33_000.mp3File renamed, old name: 2015-09-21_10-24-33_000.mp3File renamed, new name: 2015-09-21_10-24-33_000_8095320327.mp3File modified: 2015-09-21_10-24-33_000_8095320327.mp3
si pongo la ruta sin el dia:
C:\U2_V3.11\usb-record\2015\09
me sale lo siguiente:
File modified: 21
File modified: 21File modified: 21
si le pongo solo la ruta con solo el año no detecta nada.
#26
Escrito 21 septiembre 2015 - 09:25
ReadDirectoryChangesW(hDir, FI, SizeFI, TRUE, Filter, @BytesReturned, @OVL, nil)
El programita que he publicado no está muy pulido, lo escribí muy rápido ayer después de comprobar el manejo de la API ReadDirectoryChangesW. Es muy completa y con múltiples formas de uso.
Parece que la API ReadDirectoryChangesW da respuesta a tu necesidad.
Saludos.
#27
Escrito 21 septiembre 2015 - 10:00
Gracias Esca por toda tu ayuda, eres invaluable.
voy a realizar el cambio y te estare informando del avance.
gracias de nuevo por todo tu esfuerzo.