Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- EnableExplicit
- ; НЕКОТОРАЯ СТАТИСТИКА ПРИМЕНЕНИЯ
- ; | ДЛИТЕЛЬНОСТЬ ЗАМОРОЗКИ | РЕЗУЛЬТАТ |
- ; +========================+===========+
- ; | 30 СЕКУНД | БЕЗОПАСНО |
- Import "Kernel32.lib"
- OpenThread(dwDesiredAccess.l, bInheritHandle.b, dwThreadId.l)
- EndImport
- DataSection
- lbIcoCheesePause:
- IncludeBinary "tf_tray2.ico"
- lbIcoCheese:
- IncludeBinary "tf_tray.ico"
- lbSndIdle:
- IncludeBinary "idle.ogg"
- lbSndOff:
- IncludeBinary "off.ogg"
- lbSndFail:
- IncludeBinary "fail.ogg"
- lbSndOn:
- IncludeBinary "on.ogg"
- lbEndData:
- EndDataSection
- ;- ====== CONSTANTS ======
- ;{
- #PROC_SUSPEND = 1
- #PROC_RESUME = 0
- #MOD_NOREPEAT = $4000
- #TRAY_TOOLTIP_NOTSUSPENDED$ = "TFSuspend: Not suspended"
- #TRAY_TOOLTIP_SUSPENDED$ = "TFSuspend: Suspended"
- Enumeration Sounds
- #SOUND_RESUME
- #SOUND_FAIL
- #SOUND_SUSPEND
- #SOUND_IDLE
- EndEnumeration
- Enumeration Images
- #IMG_ICO_CHEESE
- #IMG_ICO_CHEESEPAUSE
- EndEnumeration
- Enumeration Menus
- #TRAY_MENU
- EndEnumeration
- Enumeration MenuItems
- #MENU_ITEM_EXIT
- EndEnumeration
- ;}
- ;- ====== GLOBALS ======
- Global TrayWindow, TrayIcon, TrayMenu, TrayWindowID
- ;{ ====== MACROS ====== }
- Macro FailWithMsgLineNumber(Message)
- MessageBox_(#Null, Message + " (" + #PB_Compiler_Filename + "@" + #PB_Compiler_Line + ")", "FAIL", #MB_OK | #MB_ICONERROR)
- End 1
- EndMacro ;}
- ;; ЗАМОРАЖИВАЕТ ЛИБО РАЗМОРАЖИВАЕТ ВСЕ ПОТОКИ ПРОЦЕССА
- ;; ProcessID ID ПРОЦЕССА
- ;; Action УСТАНОВИТЬ В #PROC_SUSPEND ДЛЯ ЗАМОРОЗКИ, ИЛИ В #PROC_RESUME ДЛЯ РАЗМОРОЗКИ
- ;; @Returns: -1 ПРИ НЕУДАЧЕ С ПОЛУЧЕНИЕМ ХЕНДЛОВ, -2 ПРИ НЕУДАЧЕ ЗАМОРОЗКИ/РАЗМОРОЗКИ,
- ;; ИНАЧЕ КОЛИЧЕСТВО ЗАМОРОЖЕННЫХ/РАЗМОРОЖЕННЫХ ПОТОКОВ
- Procedure ProcThreadsSuspendResume(ProcessID.w, Action.b)
- Protected *ThreadSnapshot, *ThreadHandle
- Protected ThreadEntry.THREADENTRY32
- Protected ProcessedCount = 0
- *ThreadSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, #Null)
- ThreadEntry\dwSize = SizeOf(THREADENTRY32)
- If *ThreadSnapshot = #INVALID_HANDLE_VALUE
- ProcedureReturn -1
- EndIf
- If Thread32First_(*ThreadSnapshot, @ThreadEntry)
- Debug #PB_Compiler_Procedure + ":Begin search threads in process #" + ProcessID
- Repeat
- If ThreadEntry\th32OwnerProcessID = ProcessID
- Debug #PB_Compiler_Procedure + ": Found thread #" + ThreadEntry\th32ThreadID
- *ThreadHandle = OpenThread(#THREAD_ALL_ACCESS, #False, ThreadEntry\th32ThreadID)
- If Action = #PROC_SUSPEND
- If SuspendThread_(*ThreadHandle) = -1
- Debug #PB_Compiler_Procedure + ": Failed to suspend thread " + Str(ThreadEntry\th32ThreadID)
- ProcedureReturn -2
- Else
- ProcessedCount + 1
- EndIf
- ElseIf Action = #PROC_RESUME
- If ResumeThread_(*ThreadHandle) = -1
- Debug #PB_Compiler_Procedure + ": Failed to resume thread " + Str(ThreadEntry\th32ThreadID)
- ProcedureReturn -2
- Else
- ProcessedCount + 1
- EndIf
- EndIf
- CloseHandle_(*ThreadHandle)
- EndIf
- Until Not Thread32Next_(*ThreadSnapshot, @ThreadEntry)
- Debug #PB_Compiler_Procedure + ": " + ProcessedCount + " threads processed"
- Else
- CloseHandle_(*ThreadSnapshot)
- ProcedureReturn -1
- EndIf
- CloseHandle_(*ThreadSnapshot)
- ProcedureReturn ProcessedCount
- EndProcedure
- Procedure SuspendOrResume(Action.b)
- Protected *ProcSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, #Null)
- Protected ProcessEntry.PROCESSENTRY32
- Protected *szExeFile, *pString.String
- Protected ProcFound.i = 0
- Protected Result = #False
- ProcessEntry\dwSize = SizeOf(PROCESSENTRY32)
- If Process32First_(*ProcSnapshot, @ProcessEntry)
- While Process32Next_(*ProcSnapshot, @ProcessEntry)
- *szExeFile = @ProcessEntry\szExeFile
- *pString = @*szExeFile
- If *pString\s = "BafflerStandalone3.exe" Or *pString\s = "Transformice.exe"
- ProcFound + 1
- Debug *pString\s + " PID: " + Str(ProcessEntry\th32ProcessID)
- If ProcThreadsSuspendResume(ProcessEntry\th32ProcessID, Action) > 0
- Result = #True
- If Action = #PROC_RESUME
- PlaySound(#SOUND_RESUME)
- ChangeSysTrayIcon(TrayIcon, ImageID(#IMG_ICO_CHEESE))
- SysTrayIconToolTip(TrayIcon, #TRAY_TOOLTIP_NOTSUSPENDED$)
- Else
- PlaySound(#SOUND_SUSPEND)
- ChangeSysTrayIcon(TrayIcon, ImageID(#IMG_ICO_CHEESEPAUSE))
- SysTrayIconToolTip(TrayIcon, #TRAY_TOOLTIP_SUSPENDED$)
- EndIf
- Else
- PlaySound(#SOUND_FAIL)
- EndIf
- EndIf
- Wend
- If ProcFound = 0
- PlaySound(#SOUND_IDLE)
- EndIf
- Else
- FailWithMsgLineNumber("Process32First failed")
- EndIf
- CloseHandle_(*ProcSnapshot)
- ProcedureReturn Result
- EndProcedure
- Procedure HotKeyThread(*Value)
- Protected Msg.MSG
- Protected Suspended.b = #False
- If Not RegisterHotKey_(#Null, 0, #MOD_ALT | #MOD_NOREPEAT, #VK_Q)
- FailWithMsgLineNumber("Failed register hotkey 0")
- EndIf
- If Not RegisterHotKey_(#Null, 1, #MOD_ALT | #MOD_NOREPEAT, #VK_W)
- FailWithMsgLineNumber("Failed to register hotkey 1")
- EndIf
- Repeat
- GetMessage_(@Msg, #Null, #WM_HOTKEY, #WM_HOTKEY)
- Debug "Message " + Str(Msg\lParam)
- If Msg\message = #WM_HOTKEY
- If Msg\wParam = 0
- If Suspended = #True
- If SuspendOrResume(#PROC_RESUME)
- Suspended = #False
- EndIf
- EndIf
- ElseIf Msg\wParam = 1
- If Suspended = #False
- If SuspendOrResume(#PROC_SUSPEND)
- Suspended = #True
- EndIf
- EndIf
- EndIf
- EndIf
- ForEver
- EndProcedure
- Procedure InitLoadResources()
- If InitSound()
- UseOGGSoundDecoder()
- If Not CatchSound(#SOUND_SUSPEND, ?lbSndOn, ?lbEndData - ?lbSndOn)
- MessageRequester("ERROR", "Can't load SOUND_SUSPEND")
- End 1
- EndIf
- If Not CatchSound(#SOUND_FAIL, ?lbSndFail, ?lbSndOn - ?lbSndFail)
- MessageRequester("ERROR", "Can't load sound SOUND_FAIL")
- End 1
- EndIf
- If Not CatchSound(#SOUND_RESUME, ?lbSndOff, ?lbSndFail - ?lbSndOff)
- MessageRequester("ERROR", "Can't load sound SOUND_RESUME")
- End 1
- EndIf
- If Not CatchSound(#SOUND_IDLE, ?lbSndIdle, ?lbSndOff - ?lbSndIdle)
- MessageRequester("ERROR", "Can't load sound SOUND_IDLE")
- End 1
- EndIf
- EndIf
- If Not CatchImage(#IMG_ICO_CHEESE, ?lbIcoCheese, ?lbSndIdle - ?lbIcoCheese)
- MessageRequester("ERROR", "Can't load image IMG_ICO_CHEESE")
- EndIf
- If Not CatchImage(#IMG_ICO_CHEESEPAUSE, ?lbIcoCheesePause, ?lbIcoCheese - ?lbIcoCheesePause)
- MessageRequester("ERROR", "Can't load image IMG_ICO_CHEESEPAUSE")
- EndIf
- EndProcedure
- Procedure InitTrayMenu()
- TrayWindow = OpenWindow(#PB_Any, 0, 0, 150, 250, "Tray", #PB_Window_Invisible)
- TrayWindowID = WindowID(TrayWindow)
- TrayIcon = AddSysTrayIcon(#PB_Any, TrayWindowID, ImageID(#IMG_ICO_CHEESE))
- TrayMenu = CreatePopupMenu(#TRAY_MENU)
- SysTrayIconToolTip(TrayIcon, #TRAY_TOOLTIP_NOTSUSPENDED$)
- MenuItem(#MENU_ITEM_EXIT, "Выход")
- EndProcedure
- ;- =========== MAIN ===========
- Define Event, EventType, HotKeyThreadHandle
- InitLoadResources()
- InitTrayMenu()
- HotKeyThreadHandle = CreateThread(@HotKeyThread(), 0)
- If Not HotKeyThreadHandle
- FailWithMsgLineNumber("Failed to create hot key thread")
- EndIf
- Repeat
- Event = WaitWindowEvent()
- EventType = EventType()
- Select EventType
- Case #PB_EventType_RightClick
- DisplayPopupMenu(#TRAY_MENU, TrayWindowID)
- EndSelect
- If Event = #PB_Event_Menu
- Select EventMenu()
- Case #MENU_ITEM_EXIT
- KillThread(HotKeyThreadHandle)
- End 0
- EndSelect
- EndIf
- ForEver
- ; IDE Options = PureBasic 5.40 LTS (Windows - x86)
- ; CursorPosition = 243
- ; FirstLine = 182
- ; Folding = 89
- ; EnableXP
- ; EnableCompileCount = 105
- ; EnableBuildCount = 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement