Код: #USB_PID=$EF04 #USB_VID=$AAAA #NO_Device="Нет связи с термометром" LoadFont(2,"Arial",22,#PB_Font_Bold) Procedure FindDevice_Timer() ; Периодическая (каждые 400 мс.) проверка доступности термометра Shared DeviceHandle Static Old_Test Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID) ; Есть ли USB требуемое HID устройство? If Test<>Old_Test Old_Test=Test If Test HID_Lib_CloseDevice(DeviceHandle) DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Подключение к HID устройству SetGadgetText(0,"Термометр подключён") Else HID_Lib_CloseDevice(DeviceHandle) ; Разрыв связи с устройством DeviceHandle=0 SetGadgetText(0,#NO_Device) SetGadgetText(1,"OFF") SysTrayIconToolTip(1,"OFF") EndIf EndIf EndProcedure Procedure Thread(*x) ; Эта процедура работает в отдельном потоке Shared DeviceHandle Repeat If DeviceHandle ; Установлена ли связь с термометром? In.l=0 HID_Lib_ReadDevice(DeviceHandle, @In, 3) ; Чтение данных из термометра ;Debug In In=In>>8 ; Сдвиг вправо на 8 позиций Result.f=In/16 If Result<150 And Result>-50 ; Отсеиваем возможные глюки! SetGadgetText(1,StrF(Result,1)+" °C") ; Отображение температуры в окне SysTrayIconToolTip(1,StrF(Result,1)+" °C") ; Отображение температуры в трее EndIf EndIf Delay(100) ForEver EndProcedure CreatePopupMenu(0) ; Контекстное меню для трея MenuItem(1,"Показать окно") MenuItem(2,"Скрыть окно") MenuBar() MenuItem(3,"Выход") OpenWindow(0,0,0,170,70,"USB_Termo", #PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered) StickyWindow(0,1) TextGadget(0,4,4,162,16,#NO_Device,#PB_Text_Center) StringGadget(1,16,24,140,40,"OFF",#PB_Text_Center|#PB_String_ReadOnly) SetGadgetFont(1,FontID(2)) SetGadgetColor(1,#PB_Gadget_FrontColor,$DF0000) FindDevice_Timer() HideWindow(0,0) SetTimer_(WindowID(0),1,400,@FindDevice_Timer()) ; Периодический вызов процедуры FindDevice_Timer(), по таймеру CreateThread(@Thread(),0) ; Создание отдельного потока из процедуры Thread() AddSysTrayIcon(1,WindowID(0),ExtractIcon_(0,ProgramFilename(),0)) ; Иконка в трее Repeat ; Главный цикл проги Repeat - Until Event=WaitWindowEvent() ; Идентификатор события If Event=#PB_Event_SysTray ; Собтыие в трее Select EventType() Case #PB_EventType_RightClick ; Клик правой кнопокй мышки DisplayPopupMenu(0,WindowID(0)) ; Отображение контекстного меню Case #PB_EventType_LeftClick ; Клик левой кнопкой мышки HideWindow(0,0) ; Отображение окна SetWindowState(0,#PB_Window_Normal) SetActiveWindow(0) EndSelect ElseIf Event=#PB_Event_Gadget ; Событие в гаджете SetActiveGadget(0) ElseIf Event=#PB_Event_MinimizeWindow ; Окно свернули HideWindow(0,1) ; Скрываем главное окно ElseIf Event=#PB_Event_Menu ; Событие в меню Select EventMenu() Case 1 ; Пункт "Показать окно" HideWindow(0,0) SetWindowState(0,#PB_Window_Normal) SetActiveWindow(0) Case 2 ; Пункт "Скрыть окно" HideWindow(0,1) Case 3 ; Пункт "Выход" Break EndSelect EndIf Until Event=#PB_Event_CloseWindow ; Прерывание главного цикла при закрытии окна KillTimer_(WindowID(0),1) ; Отключение таймера