Sorry.
Aber das scheint mir noch ein wenig zu komplex zu sein.
Ich kann dir zwar nen Code liefern, aber da musst du auch durchsteigen, weil sauber laufen tut der net und ich hab keine Lust da jetzt ewig drann zu hocken.
Das muss als DLL mit Unicode-Unterstützung kompiliert werden und dann in die zu überwachende Anwendung injiziert werden:
Code: Alles auswählen
;/---------------------------------------------------\
;| Beispiel zur Überwachung von "Open File Dialogen" |
;| by Thorium                                        |
;|                                                   |
;| Stand: 30.09.2008                                 |
;|                                                   |
;| PureBasic 4.20                                    |
;\---------------------------------------------------/
EnableExplicit
;OrigProcAddr = Funktion, die gehookt werden soll
;HookProcAddr = Hook-Prozedur
;OrigCodePatchAddr = Adresse in der Hook-Prozedur, wo der Originalcode eingepatcht werden kann
Procedure InstallInlineHook(OrigProcAddr.l,HookProcAddr,OrigCodePatchAddr.l)
  Define.l StartPos,EndPos,Length,OldProtect,Dummy
  
  ;Ermitteln der Länge des zu patchenden Codes und Einsprungpunkt
  StartPos = OrigProcAddr
  Repeat
    EndPos = DisASMCommand(StartPos)
    Length = Length + (EndPos - StartPos)
    StartPos = EndPos
  Until Length >= 7
  
  ;Schreibrechte in Hook-Prozedur setzen
  VirtualProtect_(OrigCodePatchAddr,Length + 6,#PAGE_EXECUTE_READWRITE,@OldProtect)
  
  ;Patchen der Hook-Prozedur mit dem Code, der in der Original-Funktion überschrieben wird.
  CopyMemory(OrigProcAddr,OrigCodePatchAddr,Length)
  
  ;Rücksprungcode in Hook-Funktion einpatchen
  PokeB(OrigCodePatchAddr + Length,$68) ;push const
  PokeL(OrigCodePatchAddr + Length + 1,OrigProcAddr + Length) ;const
  PokeB(OrigCodePatchAddr + Length + 5,$C3) ;ret
  
  ;Zugriffsrechte in Hook-Prozedur wiederherstellen
  VirtualProtect_(OrigCodePatchAddr,Length + 6,OldProtect,@Dummy)
  
  ;Schreibrechte in Original-Prozedur setzen
  VirtualProtect_(OrigProcAddr,Length + 6,#PAGE_EXECUTE_READWRITE,@OldProtect)
  ;patchen der Original-Prozedur
  PokeB(OrigProcAddr,$68) ;push const
  PokeL(OrigProcAddr + 1,HookProcAddr) ;const
  PokeB(OrigProcAddr + 5,$C3) ;ret
  
  ;Zugriffsrechte in Original-Prozedur wiederherstellen
  VirtualProtect_(OrigProcAddr,Length + 6,OldProtect,@Dummy)
  
EndProcedure
Procedure UninstallInlineHook(OrigProcAddr.l,OrigCodePatchAddr.l)
  Define.l StartPos,EndPos,Length,OldProtect,Dummy
  
  ;Ermitteln der Länge des überschriebenen Originalcodes
  StartPos = OrigProcAddr
  Repeat
    EndPos = DisASMCommand(StartPos)
    Length = Length + (EndPos - StartPos)
    StartPos = EndPos
  Until Length >= 7
  ;Patchen der Original-Prozedur mit dem Code, der in der Original-Funktion überschrieben wurde.
  ;Schreibrechte in Original-Prozedur setzen
  VirtualProtect_(OrigProcAddr,Length + 6,#PAGE_EXECUTE_READWRITE,@OldProtect)
  
  ;Patchen der Original-Prozedur mit dem Code, der in der Original-Funktion überschrieben wurde.
  CopyMemory(OrigCodePatchAddr,OrigProcAddr,Length)
  ;Zugriffsrechte in Original-Prozedur wiederherstellen
  VirtualProtect_(OrigProcAddr,Length + 6,OldProtect,@Dummy)
EndProcedure
Procedure GetOpenFileName_Hook(*lpofn.OPENFILENAME)
  If MessageRequester("GetOpenFileName Hook","Anwendung möchte einen OpenFile-Dialog öffnen." + Chr(10) + "Möchten sie dies zulassen?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
    ;Aufrufen der Originalprozedur
    CallFunctionFast(?GetOpenFileName_OrigCode,*lpofn)
    
    If MessageRequester("GetOpenFileName Hook","Ausgewählte Datei: " + PeekS(*lpofn\lpstrFile,#PB_Ignore,#PB_Unicode) + Chr(10) + "Möchten sie das öffnen dieser Datei unterbinden?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
      PokeW(*lpofn\lpstrFile,0)
    EndIf
  EndIf
  ProcedureReturn
  
  ;in Originalprozedur überschriebenen Code ausführen und Rücksprung
  ;wird während der Laufzeit gepatcht
  GetOpenFileName_OrigCode:
  
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
  !nop
EndProcedure
Procedure InstallOpenFileNameHook()
  Define.l hModule,ProcAddr
  hModule = OpenLibrary(#PB_Any,"comdlg32.dll")
  ProcAddr = GetFunction(hModule,"GetOpenFileNameW")
  InstallInlineHook(ProcAddr,@GetOpenFileName_Hook(),?GetOpenFileName_OrigCode)
EndProcedure
Procedure UninstallOpenFileNameHook()
  Define.l hModule,ProcAddr
  hModule = OpenLibrary(#PB_Any,"comdlg32.dll")
  ProcAddr = GetFunction(hModule,"GetOpenFileNameW")
  UnInstallInlineHook(ProcAddr,?GetOpenFileName_OrigCode)
EndProcedure
ProcedureDLL AttachProcess(Instance)
  
  InstallOpenFileNameHook()
  
EndProcedure
ProcedureDLL DetachProcess(Instance)
  
  UninstallOpenFileNameHook()
EndProcedure
Zum Test kann einfach ein universeller DLL-Injector, wie 
dieser verwendet werden.
2 große Probleme hat der Code:
Erstens wird der Dateiname nicht richtig ausgelesen oder angezeigt, keine Ahnung warum. Der ist Unicode und sollte eigentlich ausgelesen und angezeigt werden können. Tut aber net.
Zweitens knippst sich die Testanwendung (Notepad) manchmal einfach aus, wenn der Hook installiert ist und man sich im OpenFile-Dialog befindet.