Встраивание экземпляра Файлового менеджера в анкете Windows Forms

Попробуйте использовать код:

loop = 1
while loop == 1:
    try:
        a = int(input(
        "Select A Question:"
        "Dog Question: '1'"
        "Cat Question: '2'"
        "Rabbit Question: '3'"
        "Calculate Total Animals: '4'"
        "Enter one of the above options 1-4:"))
        loop = 0
    except:
        pass

if a == 1:
    f = int(input("How many doggos do you have?: "))
elif a == 2:
    h = int(input("How many cats do you have?: "))
elif a == 3:
    s = int(input("How many rabbits do you have?: "))
elif a == 4:
    loop = 0

else:
    print("Please enter a valid value e.g. '1', '2', '3'"
          "To add up your animals '4'")
12
задан Peter Mortensen 13 October 2015 в 20:57
поделиться

8 ответов

Чтобы обработать переименование, удалив и сделать другую настройку, необходимо записать собственный файловый менеджер. Управление WebBrowser не подходит для Ваших потребностей. Это - просто обертка по компоненту ActiveX.
Необходимо проверить эту codeproject статью. Это содержит реализацию файлового менеджера. Существует еще немного образцов файлового браузера:
один
два

4
ответ дан 2 December 2019 в 07:04
поделиться

LogicNP Software имеет два средств управления (FileView и ShComboBox), которые делают что Ваш поиск: http://www.ssware.com/fldrview.htm

Можно загрузить пробную версию от их страницы, однако это - ~130$ для лицензии.

3
ответ дан 2 December 2019 в 07:04
поделиться

Я написал библиотеку, которая может вам помочь. Вы можете найти его по адресу: http://gong-shell.sourceforge.net/

Элемент управления, который вы ищете, это ShellView. Там есть учебные пособия о том, как создать простой клон Windows Explorer всего в несколько строк.

Примечание для пользователей .NET 4.0 : Gong-shell в настоящее время не работает для 4.0. Фреймворк внес изменения в Interop, и он будет прекрасно работать, но будет вызывать различные проблемы при взаимодействии с shell32 (особенно API-интерфейс shellicon, приводящий к разыменованию неуправляемого нулевого указателя).

3
ответ дан 2 December 2019 в 07:04
поделиться

ПРЕДУПРЕЖДЕНИЕ: Длинное сообщение с большим количеством кода.

При навигации по управлению веб-браузером к папке файловой системы, управление веб-браузером размещает окно представления оболочки, которое в свою очередь размещает представление списка проводника. На самом деле это - точно то же самое, которое процесс Проводника делает, а также диалоговые окна файла и Internet Explorer. Это окно оболочки не является управлением, таким образом, нет никаких методов, которые можно назвать на нем или события, которые могут быть подписаны на, но оно может получить сообщения окон, и оно может быть разделено на подклассы.

Оказывается, что часть Вашего вопроса, имеющего дело с установкой представления к Деталям автоматически, на самом деле довольно легка. В Вашем событии Navigated управления веб-браузером просто находят дескриптор к окну представления оболочки и отправляют ему сообщение WM_COMMAND с конкретной оболочкой, постоянной (SHVIEW_REPORT). Это - недокументированная команда, но она поддерживается на всех платформах Windows до и включая Windows 2008 и почти наверняка будет в Windows 7. Некоторый код для добавления к форме веб-браузера демонстрирует это:

    private delegate int EnumChildProc(IntPtr hwnd, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg,
        IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern int EnumChildWindows(IntPtr hWndParent,
        EnumChildProc lpEnumFunc, IntPtr lParam);

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

    private const int WM_COMMAND = 0x0111;
    private const int SHVIEW_REPORT = 0x702C;
    private const string SHELLVIEW_CLASS = "SHELLDLL_DefView";

    private IntPtr m_ShellView;

    void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        m_ShellView = IntPtr.Zero;
        EnumChildWindows(webBrowser1.Handle, EnumChildren, IntPtr.Zero);
        if (m_ShellView != IntPtr.Zero)
        {
            SendMessage(m_ShellView, WM_COMMAND, (IntPtr)SHVIEW_REPORT, (IntPtr)0);
        }
    }

    private int EnumChildren(IntPtr hwnd, IntPtr lParam)
    {
        int retval = 1;

        StringBuilder sb = new StringBuilder(SHELLVIEW_CLASS.Length + 1);
        int numChars = GetClassName(hwnd, sb, sb.Capacity);
        if (numChars == SHELLVIEW_CLASS.Length)
        {
            if (sb.ToString(0, numChars) == SHELLVIEW_CLASS)
            {
                m_ShellView = hwnd;
                retval = 0;
            }
        }

        return retval;
    }

Каждый раз веб-браузер перешел к новому окну (включая то, когда папка открыта из представления проводника), новое окно представления оболочки создается так, сообщение должно быть снова послано новому окну в каждом событии Navigated.

Для второй части Вашего вопроса требуется получить события от представления списка проводника. Это вполне немного более трудно, чем первая часть. Чтобы сделать это, необходимо было бы разделить окно представления списка на подклассы и затем контролировать сообщения окон для, которые интересуют Вас (такие как WM_LBUTTONDBLCLK). Для разделения окна на подклассы, необходимо было бы создать собственный класс, полученный из класса NativeWindow, и присвоить ему дескриптор окна, которое необходимо контролировать. Можно затем переопределить его Оконную процедуру и обработать различные сообщения, как Вы желаете. Ниже пример создания события двойного щелчка - это относительно просто, но получить обширный доступ к представлению списка проводника может включить намного больше работы, чем Вы готовы сделать.

Добавьте это к своей форме:

    private ExplorerListView m_Explorer;

    void OnExplorerItemExecuted(object sender, ExecuteEventArgs e)
    {
        string msg = string.Format("Item to be executed: {0}{0}{1}", 
            Environment.NewLine, e.SelectedItem);
        e.Cancel = (MessageBox.Show(msg, "", MessageBoxButtons.OKCancel) 
            == DialogResult.Cancel);
    }

и эти две строки к обработчику событий, по которому Перемещаются (прямо после SendMessage):

    m_Explorer = new ExplorerListView(m_ShellView);
    m_Explorer.ItemExecuted += OnExplorerItemExecuted;

Затем добавьте следующие классы:

class ExplorerListView : NativeWindow
{

    public event EventHandler<ExecuteEventArgs> ItemExecuted;

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg,
        IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent,
        IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    private const int WM_LBUTTONDBLCLK = 0x0203;

    private const int LVM_GETNEXTITEM = 0x100C;
    private const int LVM_GETITEMTEXT = 0x1073;

    private const int LVNI_SELECTED = 0x0002;

    private const string EXPLORER_LISTVIEW_CLASS = "SysListView32";

    public ExplorerListView(IntPtr shellViewHandle)
    {
        base.AssignHandle(FindWindowEx(shellViewHandle, IntPtr.Zero, 
            EXPLORER_LISTVIEW_CLASS, null));
        if (base.Handle == IntPtr.Zero)
        {
            throw new ArgumentException("Window supplied does not encapsulate an explorer window.");
        }
    }


    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_LBUTTONDBLCLK:
                if (OnItemExecution() != 0) return;
                break;
            default:
                break;
        }
        base.WndProc(ref m);
    }

    private int OnItemExecution()
    {
        int cancel = 0;
        ExecuteEventArgs args = new ExecuteEventArgs(GetSelectedItem());
        EventHandler<ExecuteEventArgs> temp = ItemExecuted;
        if (temp != null)
        {
            temp(this, args);
            if (args.Cancel) cancel = 1;
        }
        return cancel;
    }

    private string GetSelectedItem()
    {
        string item = null;

        IntPtr pStringBuffer = Marshal.AllocHGlobal(2048);
        IntPtr pItemBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(LVITEM)));

        int selectedItemIndex = SendMessage(base.Handle, LVM_GETNEXTITEM, (IntPtr)(-1), (IntPtr)LVNI_SELECTED).ToInt32();
        if (selectedItemIndex > -1)
        {
            LVITEM lvi = new LVITEM();
            lvi.cchTextMax = 1024;
            lvi.pszText = pStringBuffer;
            Marshal.StructureToPtr(lvi, pItemBuffer, false);
            int numChars = SendMessage(base.Handle, LVM_GETITEMTEXT, (IntPtr)selectedItemIndex, pItemBuffer).ToInt32();
            if (numChars > 0)
            {
                item = Marshal.PtrToStringUni(lvi.pszText, numChars);
            }
        }

        Marshal.FreeHGlobal(pStringBuffer);
        Marshal.FreeHGlobal(pItemBuffer);

        return item;
    }

    struct LVITEM
    {
        public int mask;
        public int iItem;
        public int iSubItem;
        public int state;
        public int stateMask;
        public IntPtr pszText;
        public int cchTextMax;
        public int iImage;
        public IntPtr lParam;
        public int iIndent;
        public int iGroupId;
        int cColumns; // tile view columns
        public IntPtr puColumns;
        public IntPtr piColFmt;
        public int iGroup;

    }
}

public class ExecuteEventArgs : EventArgs
{
    public string SelectedItem { get; private set; }
    public bool Cancel { get; set; }

    internal ExecuteEventArgs(string selectedItem)
    {
        SelectedItem = selectedItem;
    }
}

Это должно дать Вам общее представление о том, что необходимо было бы сделать. Если Вы хотите больше, чем довольно простые события, можно хотеть искать альтернативное управление, хотя от того, что я видел в свободных и недорогих областях, существуют некоторые довольно достойные средства управления, но они все имеют некоторые причуды и не дадут бесшовный опыт проводника.

Помните, что этот код был соединен справедливо быстро без обработки ошибок или комментариев и игнорирования нескольких проблем, таких как несколько выбранных пунктов, так используйте его в качестве инструкции и на Ваш собственный риск.

9
ответ дан 2 December 2019 в 07:04
поделиться

Посмотрите эту статью здесь , она показывает, как это сделать в .NET и WinForms. Делая это таким образом, вы получаете полный контроль над тем, что видит пользователь.

Я использовал его в одном из своих приложений, и оно работает очень хорошо. Вы можете отобразить значок / подробности / представление списка, и это остановит переход пользователя в другие каталоги (что часто является проблемой при отображении стандартных диалоговых окон файла / каталога).

1
ответ дан 2 December 2019 в 07:04
поделиться

Если Вы счастливы быть Windows Vista только и перенести управление COM, IExplorerBrowser мог бы быть приемлемым для Вас, нуждается.

Это, которое статья Code Project показывает своему использованию в рамках программы MFC, но по крайней мере у еще одного человека, кажется, есть она для работы в C# после некоторого усилия.

Более новый API выставляет значительно больше программируемости, чем простое прерывание сообщений, но это (очевидно) бесполезно для более старых платформ.

1
ответ дан 2 December 2019 в 07:04
поделиться

Если Вы хотите открыть другое окно для отображения содержания целевой папки, можно использовать Систему. Windows. Формы. OpenFileDialog или SaveFileDialog, или наследовались FileDialog и расширяют его.

Чтобы позволить пользователю выбирать папку, можно использовать FolderBrowserDialog, хотя как пользователь мне не нравится то управление.

Это помогает, или абсолютно необходимо ли встроить управление в форму?

Asaf

0
ответ дан 2 December 2019 в 07:04
поделиться

Вы можете посмотреть на объект ExplorerBrowser.

См. http://blogs.msdn.com/ieinternals/archive/2009/12/30/Windows-7-Web-Browser-Control-will-not-browse-file-system.aspx Больше подробностей.

1
ответ дан 2 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: