Эта программа создаёт значок в трее, при клике по которому, появляется меню, с помощью которого, можно запускать заранее выбранные программы, или отредактировать спискок уже существующий программ.
Код:
; Программа для быстрого запуска приложений из трея ; Автор - Пётр. ; Компиляция производилась в PB4.00 ; Нужны библиотеки PBOSL, XP_Menu_Lib и Droopy Structure Struct Name.s ; Имя программ Path.s ; Путь к программе Key.s ; Ключи ItemMenu.l ; Здесь будет хранится идентификатор меню EndStructure #PrefName="config.ini" Global NewList DataProg.Struct() ; Создаём динамический список с прикрученой к нему структурой Procedure WindowCallback(WindowID, Message, wParam, lParam) ; Системный обработчик событий XP_Menu_CB(WindowID, Message, wParam, lParam) ProcedureReturn #PB_ProcessPureBasicEvents EndProcedure Procedure Create_Menu() ; Постоение меню If CreatePopupMenu(0) ID=MenuID(0) ItemMenu=20 ForEach DataProg() MenuItem(ItemMenu, DataProg()\Name) x=ExtractIcon_(0,DataProg()\Path,0) XP_SetMenuIcon(ID, ItemMenu, ExtractIcon_(0,DataProg()\Path,0) ) DataProg()\ItemMenu=ItemMenu ItemMenu+1 Next MenuBar() OpenSubMenu("Настройки") MenuItem(1, "Добавить/удалить...") MenuItem(2, "Открыть Файл настроек") CloseSubMenu() MenuItem(3, "Выход") XP_MenuRegister(MenuID(0), #XP_RegMenu, #XP_RegPopupMenu) ; Регистрация меню в библиотеке XP_Menu_Lib XP_SetMenuStyle(#XP_Style2003) ; Стиль меню - стиль "Офис 2003" ForEach DataProg() XP_SetMenuIcon(ID, DataProg()\ItemMenu, ExtractIcon_(0,DataProg()\Path,0) ) ; Добавляем значки в меню Next EndIf EndProcedure Procedure SavePref() ; Сожнаняем данные о файлах Result=CreatePreferences(#PrefName) If Result ForEach DataProg() PreferenceGroup(DataProg()\Name) WritePreferenceString("Path", DataProg()\Path) WritePreferenceString("Key", DataProg()\Key) Next ClosePreferences() EndIf ProcedureReturn Result EndProcedure Procedure LoadPref() ; Читаем данные о файлах If OpenPreferences(#PrefName) If ExaminePreferenceGroups() Repeat If NextPreferenceGroup()<>0 Name.s=PreferenceGroupName() If Name<>"" ;Name.s=ReadPreferenceString("name", "") Path.s=ReadPreferenceString("Path", "") If FileSize(Path)>0 AddElement( DataProg() ) DataProg()\Name=Name DataProg()\Path=Path DataProg()\Key=ReadPreferenceString("Key", "") EndIf EndIf Else Break EndIf ForEver EndIf ClosePreferences() Else If MessageRequester("ERROR", "Файл config.ini не найден! Создать его?", #PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes AddElement( DataProg() ) DataProg()\Name="cmd" DataProg()\Path=GetSystemDirectory()+"\cmd.exe" DataProg()\Key="?" If SavePref()=0 MessageRequester("Проблема", "Не удалось создать файл!"+Chr(10)+"Работа программы завершена!", #MB_OK|#MB_ICONERROR) End EndIf Else End EndIf EndIf EndProcedure Procedure UpdateListIcon() ; Заполняем таблицу - ListIconGadget ClearGadgetItemList(0) ; Очищаем таблицу x=0 ForEach DataProg() AddGadgetItem(0,x,DataProg()\Name,ExtractIcon_(0,DataProg()\Path,0)) SetGadgetItemText(0, x, DataProg()\Path, 1) SetGadgetItemText(0, x, DataProg()\Key, 2) SetGadgetItemText(0, x, Str(DataProg()\ItemMenu), 3) x+1 Next EndProcedure Procedure ADD_Window(Title.s, TablNumber, State) ; Окно добавления/редактирования If State<>0 State=1 EndIf If OpenWindow(1, 0, 0, 400, 140, Title, #PB_Window_SystemMenu|#PB_Window_WindowCentered,WindowID(0)) And CreateGadgetList(WindowID(1)) DisableWindow(0,1) ; Блокируем основное окно TextGadget(20,4,20,100,15,"Имя программы") StringGadget(21,108,16,280,20,"") TextGadget(22,4,50,100,15,"Путь к программе") StringGadget(23,108,46,250,20,"") ButtonGadget(24,364,46,30,20,"...") TextGadget(25,4,80,100,15,"Ключи") StringGadget(26,108,76,280,20,"") ButtonGadget(27,200,108,70,24,"Ок") ButtonGadget(28,300,108,70,24,"Отмена") If State=0 SetGadgetText(21,GetGadgetItemText(0,TablNumber,0)) SetGadgetText(23,GetGadgetItemText(0,TablNumber,1)) SetGadgetText(26,GetGadgetItemText(0,TablNumber,2)) EndIf Repeat Event = WaitWindowEvent() Gadget=EventGadget() If Event = #PB_Event_SysTray MessageBeep(#MB_OK) ; Ну типа мы сейчас не готовы обрабатывать события трея FlashWindow(WindowID(1),50,5) ForegroundWindowSet(WindowID(1)) SetActiveWindow(1) EndIf If Event = #PB_Event_Gadget Select Gadget Case 24 ; Кнопка "..." String.s=GetGadgetText(23) If FileSize(String)>0 Path.s=GetPathPart(String) Else Path.s="" EndIf File.s=OpenFileRequester("",Path ,"Исполняемые файлы|*.exe|Все файлы|*.*",0) If FileSize(File)>0 SetGadgetText(23,File) If GetGadgetText(21)="" ; Если поле "Имя программы" пустое, то автоматически формируем имя Name.s=GetFilePart(File) Extension.s=GetExtensionPart(File) If LCase(Extension)="exe" ; Если расширение "exe", то убираем его Name=Left(Name,Len(Name)-Len(Extension)-1) EndIf SetGadgetText(21,Name) EndIf EndIf Case 27 ; Кнопка "Ок" If GetGadgetText(21)<>"" And FileSize(GetGadgetText(23))>0 ; Убеждаемся в правильности данных Count=CountGadgetItems(0)-1 ; Количество строк в списке - ListIconGadget Name.s=GetGadgetText(21) z=0 If State=1 For i=0 To Count ; Проверяем чтобы небыло диблирования имён If Name=GetGadgetItemText(0,i,0) z=1 MessageRequester("Повторное имя", "Программа с таким именем уже существует!"+Chr(10)+"Выберите другое ммя", #MB_OK|#MB_ICONWARNING) Break EndIf Next i EndIf If z=0 If State=1 ; Добавление программы AddGadgetItem(0,TablNumber+State, Name, ExtractIcon_(0,GetGadgetText(23),0)) Else ; Редактирование SetGadgetItemText(0, TablNumber+State, Name, 0) EndIf SetGadgetItemText(0, TablNumber+State, GetGadgetText(23), 1) SetGadgetItemText(0, TablNumber+State, GetGadgetText(26), 2) If State=1 y=20 Repeat ; Ищем иникальный идентификатор для пунка меню v=0 For i=0 To Count If y=Val(GetGadgetItemText(0,i,3)) v=1 Break EndIf Next i If v=0 SetGadgetItemText(0, TablNumber+State, Str(y), 3) Break EndIf y+1 ForEver EndIf Break EndIf Else MessageRequester("Упс", "Одно из полей не заполнено"+Chr(10)+"или введены некорректные данные!", #MB_OK|#MB_ICONWARNING) EndIf Case 28 ; Кнопка "Отмена" Break EndSelect EndIf Until Event = #PB_Event_CloseWindow CloseWindow(1) EndIf DisableWindow(0,0) EndProcedure If OpenWindow(0, 0, 0, 500, 300, "Настройки", #PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) ListIconGadget(0,4,4,492,250,"Имя",100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop|#PB_ListIcon_AlwaysShowSelection) AddGadgetColumn(0,1,"Путь к программе",248) AddGadgetColumn(0,2,"Ключи",88) AddGadgetColumn(0,3,"ID",30) ButtonGadget(1,10,264,80,28,"Добавить") ButtonGadget(2,100,264,80,28,"Удалить") ButtonGadget(3,190,264,90,28,"Редактировать") ButtonGadget(4,340,264,70,28,"ОК") ButtonGadget(5,420,264,70,28,"Отмена") AddSysTrayIcon(1, WindowID(0),ExtractIcon_(0,GetEnvironmentVariable("windir")+"\system32"+"\utilman.exe",0)) SysTrayIconToolTip(1, "Быстрый запуск программ") SetWindowCallback(@WindowCallback(),0) ;HideWindow(0,0) LoadPref() UpdateListIcon() Create_Menu() Repeat Event = WaitWindowEvent() Gadget=EventGadget() Menu=EventMenu() Type=EventType() Window=EventWindow() If Event = #PB_Event_SysTray If Type = #PB_EventType_RightClick DisplayPopupMenu(0, WindowID(0)) EndIf EndIf If Event = #PB_Event_Menu Select Menu Case 1 ; Пункт меню "Добавить/удалить..." UpdateListIcon() HideWindow(0,0) Case 2 ; Пункт меню "Открыть Файл настроек" RunProgram(#PrefName) Case 3 ; Пункт меню "Выход" Break Default ; Другие пункты ForEach DataProg() If DataProg()\ItemMenu=Menu ; Нашли пункт в котором произошло событие If DataProg()\Key<>"" Parameter.s="/"+DataProg()\Key ; Пареметр для проги Else Parameter.s="" EndIf RunProgram(DataProg()\Path, Parameter,"C:\",#PB_Program_Open) Break EndIf Next EndSelect EndIf If Window=0 If Event = #PB_Event_CloseWindow HideWindow(0,1) EndIf If Event = #PB_Event_Gadget Select Gadget Case 0 ; Таблица - ListIconGadget If Type=#PB_EventType_LeftDoubleClick ; Двойной колик левой кнопкой мышки Goto KlikEdit EndIf Case 1 ; Кнопка "Добавить" x=GetGadgetState(0) If x<0 And CountGadgetItems(0)>0 MessageRequester("Ну и куда добавлять?", "В таблице не выбранна текушая программа!", #MB_OK|#MB_ICONWARNING) Else ADD_Window("Добавление программы",x, 1) EndIf Case 2 ; Кнопка "Удалить" x=GetGadgetState(0) If x<0 MessageRequester("Ну и что удалить?", "В таблице не выбранна текушая программа!", #MB_OK|#MB_ICONWARNING) Else RemoveGadgetItem(0, x) EndIf Case 3 ; Кнопка "Редактировать" KlikEdit: x=GetGadgetState(0) If x<0 MessageRequester("Ну и что редактировать?", "В таблице не выбранна текушая программа!", #MB_OK|#MB_ICONWARNING) Else ADD_Window("Редактирование",x, 0) EndIf Case 4 ; Кнопка "ОК" ClearList(DataProg()) ; Очищаем динамический список Count=CountGadgetItems(0)-1 ; Количество строк в списке - ListIconGadget For i=0 To Count ; Копируем данные из таблицы в динамический список AddElement(DataProg()) DataProg()\Name=GetGadgetItemText(0, i, 0) DataProg()\Path=GetGadgetItemText(0, i, 1) DataProg()\Key=GetGadgetItemText(0, i, 2) DataProg()\ItemMenu=Val(GetGadgetItemText(0, i, 3)) Next i XP_MenuRegister(MenuID(0), #XP_DelMenu, #XP_RegPopupMenu) ; Отменяем регистрацию меню в библиотеке XP_Menu_Lib FreeMenu(0) ; Удаляем меню Create_Menu() ; Заново строим меню SavePref() ; Сохраняем данные в файле HideWindow(0,1) Case 5 ; Кнопка "Отмена" HideWindow(0,1) EndSelect EndIf EndIf ForEver EndIf End