2016-04-06 12 views
1

Ich versuche, eine "Show" -Schaltfläche in meiner Anwendung zu erstellen. Ich möchte, dass Windows Explorer entweder in den ausgewählten Ordner geöffnet wird oder in den Ordner geöffnet und die ausgewählte Datei hervorgehoben wird.Ordner öffnen oder ausgewählte Datei in einer einzigen, verwendbaren Instanz

Ich weiß, Process.Start ("explorer.exe", Dateiname) tut dies, aber es öffnet sich in einer Version von Explorer, die nicht navigiert werden kann. Wenn Sie zum Beispiel 'Verzeichnis nach oben' drücken, öffnet sich ein neues Fenster.

Der Code, den ich unten habe, tut alles, was ich will, außer, wenn der Pfad eine Datei ist, öffnet er jedes Mal, wenn auf die Schaltfläche geklickt wird, eine neue Fensterinstanz. Wenn es sich bei dem Pfad um einen Ordner handelt, wird ein bereits vorhandenes Fenster geöffnet, sofern eines in diesem Pfad vorhanden ist.

Ich hoffe, ich kann die gleiche Funktionalität für die Dateiauswahl haben. Aber ich kann nicht herausfinden, wie es geht.

Alle und alle Hilfe wird geschätzt!

static void OpenInWin(string path) { 
    path = path.Replace("/", "\\"); 

    ProcessStartInfo pi = new ProcessStartInfo("explorer.exe") { 
     WindowStyle = ProcessWindowStyle.Normal, 
     UseShellExecute = true 
    }; 

    if (Directory.Exists(path)) { // We are opening a directory 
     pi.FileName = path; 
     pi.Verb = "open"; 
    } else { 
     pi.Arguments = "/select, \"" + new FileInfo(path).FullName + "\""; 
    } 

    try { 
     Process.Start(pi); 
    } catch(Exception e) { 
     UnityEngine.Debug.Log(e); 
    } 
} 

Antwort

0

Methode unten wird das Verzeichnis aus dem Pfad übergeben, dann öffnen Sie das Verzeichnis. Nach dem Öffnen dieses Verzeichnisses wird auf den Dateinamen (falls vorhanden) fokussiert.

Denken Sie daran, using System.Windows.Forms; für SendKeys einzuschließen.

static void OpenInWin(string path) 
{ 
    path = path.Replace("/", "\\"); 
    FileInfo fileInfo = new FileInfo(path); 

    //check if directory exists so that 'fileInfo.Directory' doesn't throw directory not found 

    ProcessStartInfo pi = new ProcessStartInfo("explorer.exe") 
    { 
     WindowStyle = ProcessWindowStyle.Normal, 
     UseShellExecute = true, 
     FileName = fileInfo.Directory.FullName, 
     Verb = "open" 
    }; 

    try 
    { 
     Process.Start(pi); 
     Thread.Sleep(500); // can set any delay here 
     SendKeys.SendWait(fileInfo.Name); 
    } 
    catch (Exception e) 
    { 
     throw new Exception(e.Message, e); 
    } 
} 


Hinweis: Es könnte eine bessere Art und Weise des Sendens Schlüssel zu einem Prozess. Sie können unter der Methode experimentieren:

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

public static void SendKey() 
{ 
    Process notepad = new Process(); 
    notepad.StartInfo.FileName = @"C:\Windows\Notepad.exe"; 
    notepad.Start(); 

    notepad.WaitForInputIdle(); 

    IntPtr p = notepad.MainWindowHandle; 
    ShowWindow(p, 1); 
    SendKeys.SendWait("Text sent to notepad"); 
} 

Edit:

Um Schlüsselereignisse zu erzeugen, ohne Windows-Kontext Forms Wir können die folgende Methode verwenden,

[DllImport("user32.dll")] 
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 

Beispielcode ist siehe unten:

const int VK_UP = 0x26; //up key 
    const int VK_DOWN = 0x28; //down key 
    const int VK_LEFT = 0x25; 
    const int VK_RIGHT = 0x27; 
    const uint KEYEVENTF_KEYUP = 0x0002; 
    const uint KEYEVENTF_EXTENDEDKEY = 0x0001; 
    static int press() 
    { 

//Press the key 
     keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); 
     return 0; 

    } 

Liste der virtuellen Schlüssel sind definiert here.

Um ein vollständiges Bild zu erhalten, wenden Sie sich bitte den folgenden Link, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

+0

Hey verwenden! Danke dafür. Leider kann ich es nicht testen, da ich Unity verwende, von dem ich denke, dass es nur .net 2.0 verwendet? Und es scheint, als ob System.Windows später kam? – stuntboots

+1

Mein Kommentar gestern (nach dem Verständnis des Problems) ist deine Antwort heute, nette;) @stuntboots System.Windows kam weit vor Unity. Ich habe die Antwort bearbeitet, um Ihnen zu zeigen, wie Sie wichtige Ereignisse ohne Windows Forms Context erzeugen können. –

+0

@stuntboots Wenn Sie zu Unity 5 wechseln, können Sie .Net 3.5 verwenden – Antony