Эта программа создаёт значок в трее, при клике по которому, появляется меню, с помощью которого, можно запускать заранее выбранные программы, или отредактировать спискок уже существующий программ.
Код:
; Программа для быстрого запуска приложений из трея
; Автор - Пётр.
; Компиляция производилась в 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