2017-07-05 7 views
1

Ich versuche, den Pfad ausgewählter Dateien und Ordner aus dem Standard-OpenFileDialog-Fenster, das von einer anderen Anwendung erstellt wurde, zu erfassen.OpenFileDialog Spy

Ich habe gesehen, dass möglich ist, diese Aufgabe mit dem Windows Explorer auszuführen:

IntPtr handle = GetOpenFileDialogHwnd(); 

ArrayList selected = new ArrayList(); 
var shell = new Shell32.Shell(); 

foreach(SHDocVw.InternetExplorer window in shell.Windows()) 
{ 
    if (window.HWND == (int)handle) 
    { 
     Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
     foreach(Shell32.FolderItem item in items) 
     { 
      selected.Add(item.Path); 
     } 
    } 
} 

jedoch die SHDocVw.ShellWindows() -Methode des geöffneten Openfile Hwnd nicht zurück. Als Windows-Explorer zu Openfile sehr ähnlich ist, stelle ich mir es eine Möglichkeit ist eine Besetzung mit der Hwnd von Openfiledialog für die Shell32.IShellFolderViewDual2 Schnittstelle wie zu tun:

var view = Shell32.ShellFolderViewDual2.FromHwnd(hwnd); 

Gibt es eine andere Möglichkeit?

Das Ziel ist einfach, machen Sie ein Protokoll der Dateien in Standard-OpenFileDialog-Fenstern verwendet. Workable in Windows 7, 8, 10.

Ich weiß, es scheint eine sehr sehr sehr seltsame Sache.

Edit:

Inspect.exe geben mir Hoffnung:

enter image description here

Antwort

1

Eine offene Datei Dialogfenster kein Shell ist, damit es nicht in der Liste auftauchen Shellwindows.

Sie können send the undocumented WM_GETISHELLBROWSER (WM_USER+7) message to the dialog window, aber der zurückgegebene IShellBrowser-Zeiger ist nur innerhalb des gleichen Prozesses gültig. Die Verwendung in einem anderen Prozess würde zu einer Zugriffsverletzung führen.

Sobald Sie IShellBrowser haben, können Sie get other interfaces like IShellView or IFolderView2. Für die Auswahl möchten Sie IFolderView2 :: GetSelection verwenden.

Es ist möglich, eine Proxy-DLL in den Zielprozess zu injizieren, um den Dateidialog zu steuern, aber Sie können die DLL nicht in C# schreiben.