Рейтинг:
11
Graeme_Grant
Вот, держи... Загрузка StartMenu во всплывающее меню...
Public Class Form1
Public Sub New()
InitializeComponent()
BuildMenu()
End Sub
Private Sub BuildMenu()
Dim cm = New ContextMenu()
Dim startMenu = Environment.GetFolderPath( _
Environment.SpecialFolder.CommonStartMenu)
BuildMenuLevel(cm, startMenu)
butStartMenu.ContextMenu = cm
End Sub
' walk through the folder levels and build a menu
Private Sub BuildMenuLevel(cm As ContextMenu, parentFolder As String, _
Optional parentMenu As MenuItem = Nothing)
Dim folders = IO.Directory.GetDirectories(parentFolder)
For Each folder As String In folders
Dim files = IO.Directory.GetFiles(folder)
Dim menuItems = New List(Of MenuItem)()
For Each file As String In files
menuItems.Add(New MenuItem(_
IO.Path.GetFileNameWithoutExtension(file), _
New EventHandler(AddressOf AppClicked)))
Next
Dim folderMenu As MenuItem
Dim folderName As String = folder.Split("\"c).Last()
If parentMenu Is Nothing Then
folderMenu = cm.MenuItems.Add(folderName, menuItems.ToArray())
Else
folderMenu = parentMenu.MenuItems.Add(folderName, menuItems.ToArray())
End If
BuildMenuLevel(cm, folder, folderMenu)
Next
End Sub
Private Sub butStartMenu_Click(sender As Object, e As EventArgs) _
Handles butStartMenu.Click
butStartMenu.ContextMenu.Show(butStartMenu, _
New Point(butStartMenu.Left, butStartMenu.Top))
End Sub
Private Sub AppClicked(sender As Object, e As EventArgs)
' selected item
Dim menuItem = TryCast(sender, MenuItem)
Debug.WriteLine("File: {0}", menuItem.Text)
Debugger.Break()
End Sub
End Class
ОБНОВЛЕНИЕ: Как обобщить функцию BuildMenu для работы с любой кнопкой & и папкой каталога:
Private Sub BuildMenu(startMenu as String, destButton as Button)
Dim cm = New ContextMenu()
BuildMenuLevel(cm, startMenu)
destButton.ContextMenu = cm
End Sub
использовать:
dim startMenuPath as String = Environment.GetFolderPath( _
Environment.SpecialFolder.CommonStartMenu)
BuildMenu(startMenuPath, butStartMenu)
[no name]
Прежде всего спасибо!
хотя там написано ...доступ запрещен: C:\ProgramData\Microsoft\Windows\Start меню\программы .. я не уверен, в чем проблема
Graeme_Grant
Проверено и работает здесь...
Проверьте свое внутреннее исключение exception & / или тип исключения. Это даст информацию, объясняющую, почему. На первый взгляд, это исключение безопасности - уровень безопасности пользователя недостаточно высок для доступа к папке.
[no name]
у меня также есть еще одна проблема...я не очень хорошо понимаю код..."butStartmenu" - это обычная кнопка, верно? .... а "парентмену" - стрипмену, верно? . это не открывает никакого меню, когда я нажимаю на кнопку?!???!?!?!
извините ...я просто не совсем понимаю это
Graeme_Grant
butStartmenu
это обычная кнопка.
BuildMenuLevel
меню parentMenu
переменная параметра - это MenuItem
объект.
Меню инициализируется в конструкторе формы. Вы сделали то же самое?
[no name]
я не вижу, где стрипмену входит в этот код .... :(
[no name]
я не делаю это правильно ... я нажимаю на кнопку, но меню не открывается..
[no name]
хорошо, это работает, спасибо... но теперь я не знаю, как обедать файлы оттуда..я использую: Process.Start ("File: {0}", menuItem.Text) .. но не повезло!!!
Graeme_Grant
Этот вопрос сейчас работает и закрыт. Это новый вопрос.
[no name]
оставьте его..я мог бы не использовать его в конце концов.. он дает ошибку (отказано в доступе к папке startmenu)..в любом случае, спасибо за вашу помощь ... я оценил это ... спасибо
Graeme_Grant
Похоже на исключение из правил безопасности. Покопайтесь в ошибке, и информация будет там.
[no name]
Эй, я кручу ваш код, чтобы удовлетворить мои потребности, и у меня есть несколько вопросов по этому поводу ... если это возможно для вас, чтобы занять еще немного вашего времени.-это было бы здорово....
Это новый код:
Дим папки = ИО.Каталог.GetDirectories("C:\")
Для каждой папки в виде строки в папках
Дим файлов = ИО.Каталог.GetFiles (папка)
Дим меню = новый список(пункт меню)()
Для каждого файла в виде строки в файлах
пункт меню.Добавить(новый MenuItem(ИО.Путь.GetFileNameWithoutExtension(файл)))
Следующий
Тусклый folderMenu как MenuItem
Dim folderName As String = folder.Split ("\"c). последний()
Бассейн.ContextMenuStrip2.Предметы.Добавить(имя папки)
Следующий
что мне нужно изменить, чтобы в меню отображались подпапки и файлы??
Не могли бы вы снова занять немного своего времени ???
Graeme_Grant
Вы не. Установите верхнее или корневое меню в BuildMenu
и он сделает всю работу за вас.
[no name]
ну, я хочу добавить 3 из них..3 кнопки, которые открывают разные меню с разными папками..я не знаю, как интегрировать ваш код для того, чтобы сделать это... так что было бы здорово иметь решение, используя мой последний опубликованный код!!!
Graeme_Grant
Сделано. См. раздел Обновление в решении. В этом действительно нет ничего сложного.
[no name]
арргггг.. извините, что я этого не понимаю...наверное, я слишком хромаю для этого :(
Graeme_Grant
Передайте папку и кнопку исправленному BuildMenu
sub и он прикрепит всплывающее окно структуры меню (папка и файл) к переданной кнопке, например:
Скрыть скопировать код
BuildMenu("c:\\MyRootFolder", MyCustomPathPopupButton)
Затем, как и в коде, который вы скачали, подключите событие click
MyCustomPathPopupButton
чтобы показать всплывающее окно:
Private Sub MyCustomPathPopupButton_Click(sender As Object, e As EventArgs) _ Handles MyCustomPathPopupButton.Click MyCustomPathPopupButton.ContextMenu.Show(butStartMenu, _ New Point(MyCustomPathPopupButton.Left, butStartMenu.Top))
End Sub
Простой.
[no name]
ОК должно быть что то вроде этого верно:
Общественные Саб Новый()
метод InitializeComponent()
Dim startMenuPath As String = Environment.GetFolderPath(
Окружающая среда.Специальная папка.Мои документы)
BuildMenu(startMenuPath, butStartMenu)
Конец Подводной Лодки
Частная суб BuildMenu(меню в виде строки, destButton как кнопка)
Dim cm = новое контекстное меню()
BuildMenuLevel(см, меню)
destButton.Контекстное меню = см
Конец Подводной Лодки
но я возвращаю ошибку отказа в доступе, когда пытаюсь использовать "C:\" для eg.
Graeme_Grant
Посмотрите на тип исключения и остальную информацию об исключении в окне отладки locals. Это исключение безопасности UAC.
Я ответил на первоначальный вопрос и ответил на "расширенные" вопросы + запрос на образец кода. Теперь пришло время поиграть с ним, установить точки останова и учиться. Я закрываю это дело... удачи.
[no name]
хорошо...большое спасибо за ваше время и знания...Спасибо!
[no name]
нет...я не понимаю...это было трудно для меня ... прости...
Рейтинг:
0
OriginalGriff
Попробовать это:
string startMenu = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu);
(это было добавлено в .NET 4.0, поэтому, если вы используете более низкую версию, вам нужно будет использовать Win32 API
Функция SHGetSpecialFolderPath (Windows)[
^], которые будут подключаться и работать больше и атрибута DllImport:
[DllImport("shell32.dll")]
static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner,
[Out] StringBuilder lpszPath, int nFolder, bool fCreate);
[no name]
аррггг!! это не работает...я действительно хотел бы получить кусок кода для этого...что я хочу сделать, так это воссоздать startmenu в моем всплывающем меню...не графический интерфейс ... только папки и файлы внутри.....
Graeme_Grant
"Не работать"... Это то, что вы говорите механику, когда у вас есть проблемы с вашей машиной?
Что такое "не работает"?
Какой код вы пробовали до сих пор, который "не работает"?
Вы хотите, чтобы мы поделились с вами кодом, но ничего не предлагаете взамен, кроме неясности и требований. Переосмыслите, как вы подходите к коллегам-разработчикам, которые отдают свое свободное время, чтобы помочь другим. Нам не платят и мы не обязаны помогать вам.
[no name]
я считаю, что вы сошли с ума ... никто ничего не требует...я просто прошу о помощи!
Забудь это..
Graeme_Grant
Нет, не сумасшедший.
FWIW, ответ OriginalGriff - это отправная точка - это "корневое" местоположение для того, что вы ищете. Получите возвращенный адрес папки, откройте Проводник и перейдите к нему. Вот увидишь...
[no name]
нет man..my проблема немного в другом...я могу перечислить файлы и папки(но не подкаталоги) во всплывающем меню..с фрагментами из google..но это не работает, потому что я не могу "объединить" их..или я перечисляю файлы или перечисляю папки..и некоторые коды из google дают мне ошибку отказа в доступе к специальной папке "commonStartup"...вот почему я сказал, что мне нужен кусок кода для этого..потому что я не могу понять это самостоятельно...
Graeme_Grant
Тогда опубликуйте свой код. Нажмите на виджет "улучшить вопрос".
[no name]
хорошо ... отправлено...
[no name]
я также хотел бы получить доступ к файлам и папкам из всплывающего меню!!!