2013-04-06 1 views
1

Я не знаю, является ли OpenFiledialog правильным элементом управления, но я хочу открыть уже отмеченный путь к файлу в моем основном элементе управления. У меня есть программа, которая реализует это, но я не знаю, как это сделать.OpenFileDialog в моей форме Не открывается всплывающая форма браузера Windows

Когда пользователь нажимает кнопку, столбец слева на картинке ниже показывает папку последнего открытого пути к файлу. Как это сделать. У меня уже есть путь к папке, которую я хочу отобразить, какие элементы управления мне следует использовать, какой-либо код будет высоко оценен sample

+0

Я не могу понять вопрос –

+0

Привет Дэвид, я редактировал мой вопрос и изображение. Я хочу, чтобы моя форма отображала последний путь, который я посетил, как показано в левой части этого рисунка. – Basco

ответ

0

Вы можете сделать это с помощью функции SetParent. ниже - пример только для образовательных целей!

using System; 
using System.Diagnostics; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 

namespace WindowsFormsApplication4 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      this.Size = new System.Drawing.Size(800, 600); 
      this.TopMost = true; 
      this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
      Func<bool> run =() => 
       Window.Find(hwnd => 
       { 
        var cn = Window.GetClassName(hwnd); 
        var res = (cn == "CabinetWClass"); 
        if (res) 
        { 
         this.Controls.Clear(); 
         Window.SetParent(hwnd, this.Handle); 
         Window.SetWindowPos(hwnd, new IntPtr(0), -8, -30, this.Width + 10, this.Height + 37, 0x0040); 
        } 
        return res; 
       }); 

      new Button { Parent = this, Text = "Start" } 
       .Click += (s, e) => 
        { 
         if (run() == false) 
          MessageBox.Show("Open Explorer"); 
        }; 
     } 
    } 

    public static class Window 
    { 
     public static bool Find(Func<IntPtr, bool> fn) 
     { 
      return EnumWindows((hwnd, lp) => !fn(hwnd), 0) == 0; 
     } 
     public static string GetClassName(IntPtr hwnd) 
     { 
      var sb = new StringBuilder(1024); 
      GetClassName(hwnd, sb, sb.Capacity); 
      return sb.ToString(); 
     } 
     public static uint GetProcessId(IntPtr hwnd)  // {0:X8} 
     { 
      uint pid; 
      GetWindowThreadProcessId(hwnd, out pid); 
      return pid; 
     } 
     public static string GetText(IntPtr hwnd) 
     { 
      var sb = new StringBuilder(1024); 
      GetWindowText(hwnd, sb, sb.Capacity); 
      return sb.ToString(); 
     } 

     delegate bool CallBackPtr(IntPtr hwnd, int lParam); 

     [DllImport("user32.dll")] 
     static extern int EnumWindows(CallBackPtr callPtr, int lPar); 

     [DllImport("user32.dll")] 
     static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

     [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); 

     [DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)] 
     public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int W, int H, uint uFlags); 
    } 
} 
+0

Как это относится к вопросу? –

0

если я понимаю вопрос, который вы хотите открыть в качестве проводника Windows по определенному пути. его простой тогда, вы не используете контроль просто сделать это:

Process.Start("Your path here"); 
+0

Я, наконец, использовал решения Gong, и он отлично работал http://gong-shell.sourceforge.net/tutorials/filedialog.php – Basco

Смежные вопросы