2016-04-27 4 views
1

Obwohl diese Frage bereits zuvor gestellt wurde, brachte mich der Code in den Antworten nicht weiter, also kann vielleicht jemand Licht dazu bringen.Erhalten Sie den vollen Pfad eines Explorer-Fensters durch ein Handle in C#

Ich habe den Großteil des Codes von this beantwortet Frage.

Grundsätzlich möchte ich erreichen, dass diese Methode den vollständigen Pfad des Fensters zurückgibt, das dem Handle entspricht. Die Methode wird später extern mit der .DLL verwendet, in die dieser Code kompiliert wird.

Das Problem, das ich habe, ist, dass Explorer aus irgendeinem Grund immer NULL ist und somit keinen Pfad zurückgibt.

Ich würde mich freuen, wenn irgendjemand etwas Licht in diese Sache bringen könnte, damit ich und wahrscheinlich andere Leute, die Probleme in dieser Angelegenheit haben, wissen könnten, was ich hier tun soll.

+0

im gleichen Format wie vorgesehen Was wird Ihre App Längerfristig tun? Wenn Sie möchten, dass es als Kontextmenü verfügbar ist, wird die Datei, auf die Sie klicken, den vollständigen Pfad senden. Einige davon sind daher vielleicht unnötig. – BugFinder

+0

Ah, im Grunde muss ich es in unsere eigentliche Programmiersprache Windev implementieren, die ich kann erreichen, indem es als .dll geladen wird. Langfristig möchte ich Drag & Drop aus dem Programm in den Explorer bringen, allerdings nicht über C#, sondern über Windev. – FBC

+0

Hmm, nicht ein Bereich, den ich noch nicht ausprobiert habe. Ich würde mir jedoch vorstellen, dass der explorer so aussehen würde, als würde das gezogene Objekt eine Datei beanspruchen, so wie es vmware erlaubt, Drop von außerhalb des Betriebssystems zu ziehen in die vm etc .. – BugFinder

Antwort

0

Dank der Slatchz-Antwort und verschiedener Ansätze aus ähnlichen Themen, habe ich einen Weg gefunden, den Pfad durch den Griff des Fensters zu erhalten. Es ist mehr oder weniger eine Mischung aus allen und ich hoffe, dass es Menschen helfen wird, die in Zukunft genau danach suchen.

 //Method to obtain the window path that corresponds to the handle passed 
    public static string GetWindowPath(int handle) 
    { 
     //Default value for the variable returned at the end of the method if no path was found 
     String Path = ""; 


     SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 


     foreach (SHDocVw.InternetExplorer window in shellWindows) 
     { 

      //If Window handle corresponds to passed handle 
      if (window.HWND == handle) 
      { 
       //Print path of the respective folder and save it within the returned variable 
       Console.WriteLine(window.LocationURL); 
       Path = window.LocationURL; 
       break; 
      } 

     } 

     //If a path was found, retun the path, otherwise return "" 
     return Path; 



    } 

Der Weg in shlatchz Antwort zurückgegeben wird file:///C:/Program%20Files/...

1

Hier ist, wie ich das Verzeichnis jedes Explorer-Fenster zu drucken:

public void RefreshWindow() 
{ 
    Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000"); 
    Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true); 

    object shellApplication = Activator.CreateInstance(shellApplicationType); 
    object windows = shellApplicationType.InvokeMember("Windows", System.Reflection.BindingFlags.InvokeMethod, null, shellApplication, new object[] { }); 

    Type windowsType = windows.GetType(); 
    object count = windowsType.InvokeMember("Count", System.Reflection.BindingFlags.GetProperty, null, windows, null); 
    Parallel.For(0, (int)count, i => 
    { 
     object item = windowsType.InvokeMember("Item", System.Reflection.BindingFlags.InvokeMethod, null, windows, new object[] { i }); 
     Type itemType = item.GetType(); 
     string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null); 
     if (itemName == "Windows Explorer" || itemName == "File Explorer") 
     { 
      string currDirectory = (string)itemType.InvokeMember("LocationURL", System.Reflection.BindingFlags.GetProperty, null, item, null); 
      Console.WriteLine(currDirectory); 
     } 
    }); 
} 

Das Adressformat ist file:///C:/Program%20Files/....

Sie können diese Adressformat zu dem einen analysieren Sie (Durch Entfernen des file:/// Präfix und / mit \ ersetzen) wollen & auch die HTML encoding Decodierung.

+0

nett :) könnte es wert sein, ein Beispiel für die Ausgabe - I Beachten Sie, dass es sich um eine 'Datei:' uri handelt. –

+0

Vielen Dank für Ihre Antwort! Ich habe versucht, dies in einer Konsolenanwendung zu implementieren, nur um die Ausgabe zu testen, aber aus irgendeinem Grund läuft es nicht in das endgültige "if", weil der Elementname null ist. Verwende ich es zufällig falsch? – FBC

+0

Nevermind, der Elementname in meinem Fall war "Windows-Explorer" anstelle von "Windows Explorer", es druckt nun tatsächlich das Verzeichnis jedes Explorer-Fensters genau so, wie es sein sollte. Jetzt wäre die einzige Frage, wie ich nur einen der Pfade durch einen Fenstergriff erhalten könnte. – FBC

Verwandte Themen