2016-04-06 21 views
1

Uygulamamda bir 'Göster' düğmesi oluşturmaya çalışıyorum. Bunun Windows Gezgini'ni seçili klasöre açmasını veya klasöre açılmasını ve seçili dosyayı vurgulamasını istiyorum.Klasörü veya Seçilen Dosyayı Tek, Kullanılabilir Örnekte Açma

Process.Start'ın ("explorer.exe", fileName) bunu biliyorum, ancak Explorer'ın gezinilemeyen bir sürümünde açılır. Örneğin 'Up Directory' tuşuna basmak yeni bir pencere açar.

Aşağıda sahip olduğum kod, bir dosya bir dosya olduğunda, düğmenin her tıklatıldığında yeni bir pencere örneğini açması dışında, istediğim her şeyi yapar. Yol bir klasör olduğunda, bu yoldan biri varsa, zaten var olan bir pencereyi açar.

Dosya seçimi için aynı işlevselliğe sahip olabileceğimi umuyorum. Ama bunu nasıl yapacağımı anlayamıyorum.

Her türlü yardım için teşekkür ederiz!

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); 
    } 
} 

cevap

0

Aşağıdaki yöntem dizini geçirilen yoldan alacaktır, ardından bu dizini açın. Bu dizini açtıktan sonra dosya adına (varsa) odaklanacaktır.

SendKeys için using System.Windows.Forms;'u eklediğinizden emin olun.

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); 
    } 
} 


Not: bir işleme anahtarlarını göndererek daha iyi bir yolu olabilir.

[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"); 
} 

Düzenleme: Windows Bağlam Forms olmadan

, Biz aşağıdaki yöntemi kullanabilirsiniz, önemli olayları üretmek

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

örnek kod Aşağıdaki yöntemi ile deneme yapabilirsiniz Aşağıda verilenler:

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; 

    } 

Sanal Anahtarlar Listesi here olarak tanımlanmıştır.

aşağıdaki bağlantıyı, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

+0

Hey kullanın lütfen tamamını görmek için! Bunun için teşekkürler. Maalesef, sadece 2.0. Kullanabileceğini düşündüğüm Unity'yi kullandığım için test edemiyorum. Ve System.Windows bundan daha sonra geldi gibi görünüyor? – stuntboots

+1

Benim yorum dün (sorununu anladıktan sonra) bugün senin cevabın, güzel bir;) @stuntboots System.Windows Birlikten önce geldi. Windows Forms Bağlamı olmadan önemli olayları nasıl üreteceğinizi göstermek için cevabı düzenledim. –

+0

@stuntboots Unity 5'e geçerseniz .Net 3.5 – Antony

İlgili konular