;-----------------------USB-переключатель-------------------------
;{---------Запрет на запуск программы более одного раза-----------
a = CreateSemaphore_(#Null,0,1,"USB-переключатель")
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS
CloseHandle_(a)
End
EndIf
;}---------------------------------------------------------------
;{----------------------Глобальные переменные------------------
#USB_PID=$EF22 ;идентификатор PID
#USB_VID=$AAAA ;идентификатор VID
#Name="USB-переключатель" ;сообщения программы
#NO_Device="Нет связи с USB-переключателем" ;сообщения программы
Global IN_TV.s="телевизор" ;сообщения программы
Global IN_Speakers.s="колонки" ;сообщения программы
Global R_DeviceHandle, W_DeviceHandle
;}---------------------------------------------------------------
Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
valueName$=ProgramFilename()
GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
If GetHandle = #ERROR_SUCCESS
If State=1
RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
Else
RegDeleteValue_(hKey, @ProgName)
EndIf
RegCloseKey_(hKey)
EndIf
EndProcedure
Procedure FindDevice_Timer(); таймер - процедура проверки подключения нашего устройства
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID)
If Test<>Old_Test
Old_Test=Test
If Test
HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
SetGadgetText(0,"USB-переключатель подключён")
Else
HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
R_DeviceHandle=0 : W_DeviceHandle=0
SetGadgetText(0,#NO_Device)
EndIf
EndIf
EndProcedure
Procedure SendDevice()
Command.a=0
Dim OutBytes.a(2)
If GetGadgetState(5)=1
Command | 1
TextGadget(54, 83, 17, 80 ,15, IN_TV)
SetMenuItemState(68,4,1)
SetMenuItemState(68,3,0)
Else
Command & %11111110
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
SetMenuItemState(68,3,1)
SetMenuItemState(68,4,0)
EndIf
Command << 1
If W_DeviceHandle
OutBytes(0) = 0
OutBytes(1) = Command
HID_Lib_WriteDevice(W_DeviceHandle, @OutBytes(), 2)
Else
MessageRequester(#Name, #NO_Device, 16)
EndIf
EndProcedure
Procedure DateStatusBar(); Эта процедура вызывается по таймеру два раза в секунду.
Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
Date.s = FormatDate("%dd.%mm.%yyyy", Date() ) ; узнаем дату
StatusBarText(0, 0,Date, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 0.
StatusBarText(0, 2,Time, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 2.
EndProcedure
IconName$ = "F:\USB-переключатель\Колонки.ico"
IconName1$ = "F:\USB-переключатель\Телек.ico"
OpenWindow(0,0,0,230,83,#Name,#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
CompilerIf #PB_Editor_CreateExecutable
ProgramAtStartup(1, "USB-переключатель");"Добавить в автозагрузку"
CompilerEndIf
StickyWindow(0,1);поверх всех открытых окон
TextGadget(0,0,0,230,15,#NO_Device, #PB_Text_Center)
ButtonGadget(5,65,33,100,23,"Переключить",#PB_Button_Toggle)
TextGadget(2, 33, 17, 50 ,15,"Выход на ")
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
;-----------Создаём строку состояния-----------
CreateStatusBar(0, WindowID(0))
; Делим её на области
AddStatusBarField(70)
AddStatusBarField(90)
AddStatusBarField(70)
StatusBarText(0, 1,"Дата и время", #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 1.
OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"
;-----------Системный трей-----------
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "USB-переключатель")
;Добавим к иконке меню
CreatePopupMenu(68)
;MenuItem(1, "Развернуть")
;MenuItem(2, "Свернуть")
MenuItem(3, "Колонки")
SetMenuItemState(68,3,1)
MenuItem(4, "Телевизор")
MenuBar()
MenuItem(10, "Выход")
HideWindow(0,0)
FindDevice_Timer()
AddWindowTimer(0, 2, 400)
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_Timer
If EventTimer()=2
FindDevice_Timer()
EndIf
ElseIf Event=#PB_Event_Gadget
Select EventGadget()
Case 5
SendDevice()
EndSelect
EndIf
If Event = #PB_Event_SysTray
If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки
DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню
; Break
EndIf
If EventType() = #PB_EventType_LeftClick ; Обработка левой кнопки мышки
HideWindow(0, 1)
EndIf
If EventType() = #PB_EventType_LeftDoubleClick ; Обработка двойного нажатия левой кнопки мышки
HideWindow(0, 0)
SetWindowState(0, #PB_Window_Normal)
EndIf
EndIf
If Event = #PB_Event_Menu
Select EventMenu()
; Case 1 ;"Развернуть"
; HideWindow(0, 0)
; SetWindowState(0, #PB_Window_Normal)
;Case 2 ;"Свернуть"
; HideWindow(0, 1)
Case 3 ;"Колонки"
SetGadgetState(5, 0)
SendDevice()
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
SetMenuItemState(68,3,1)
SetMenuItemState(68,4,0)
ChangeSysTrayIcon (EventGadget(), LoadImage(30, IconName$))
Case 4 ;"Телевизор"
SetGadgetState(5, 1)
SendDevice()
TextGadget(54, 83, 17, 80 ,15, IN_TV)
SetMenuItemState(68,4,1)
SetMenuItemState(68,3,0)
ChangeSysTrayIcon (EventGadget(), LoadImage(31, IconName1$))
Case 10 ;"Выход"
Break
EndSelect
EndIf
If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
HideWindow(0,1) ;свернуть окно
EndIf
Until Event=#PB_Event_CloseWindow
; Вызываем функцию "KillTimer"
CallFunction(0,"KillTimer",WindowID(0),1)
; Закрываем файл "user32.dll".
CloseLibrary(0)