Advertisement
Guest User

Untitled

a guest
Apr 18th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. EnableExplicit
  2.  
  3. ; НЕКОТОРАЯ СТАТИСТИКА ПРИМЕНЕНИЯ
  4. ; | ДЛИТЕЛЬНОСТЬ ЗАМОРОЗКИ | РЕЗУЛЬТАТ |
  5. ; +========================+===========+
  6. ; | 30 СЕКУНД              | БЕЗОПАСНО |
  7. Import "Kernel32.lib"
  8.   OpenThread(dwDesiredAccess.l, bInheritHandle.b, dwThreadId.l)
  9. EndImport
  10.  
  11. DataSection
  12.   lbIcoCheesePause:
  13.   IncludeBinary "tf_tray2.ico"
  14.   lbIcoCheese:
  15.   IncludeBinary "tf_tray.ico"
  16.   lbSndIdle:
  17.   IncludeBinary "idle.ogg"
  18.   lbSndOff:
  19.   IncludeBinary "off.ogg"
  20.   lbSndFail:
  21.   IncludeBinary "fail.ogg"
  22.   lbSndOn:
  23.   IncludeBinary "on.ogg"
  24.   lbEndData:
  25. EndDataSection
  26.  
  27. ;- ====== CONSTANTS ======
  28. ;{
  29. #PROC_SUSPEND  = 1
  30. #PROC_RESUME   = 0
  31. #MOD_NOREPEAT  = $4000
  32.  
  33. #TRAY_TOOLTIP_NOTSUSPENDED$ = "TFSuspend: Not suspended"
  34. #TRAY_TOOLTIP_SUSPENDED$    = "TFSuspend: Suspended"
  35.  
  36. Enumeration Sounds
  37.   #SOUND_RESUME
  38.   #SOUND_FAIL
  39.   #SOUND_SUSPEND
  40.   #SOUND_IDLE
  41. EndEnumeration
  42.  
  43. Enumeration Images
  44.   #IMG_ICO_CHEESE
  45.   #IMG_ICO_CHEESEPAUSE
  46. EndEnumeration
  47.  
  48. Enumeration Menus
  49.   #TRAY_MENU
  50. EndEnumeration
  51.  
  52. Enumeration MenuItems
  53.   #MENU_ITEM_EXIT
  54. EndEnumeration
  55. ;}
  56.  
  57. ;- ======  GLOBALS  ======
  58. Global TrayWindow, TrayIcon, TrayMenu, TrayWindowID
  59.  
  60. ;{ ====== MACROS ====== }
  61. Macro FailWithMsgLineNumber(Message)
  62.   MessageBox_(#Null, Message + " (" + #PB_Compiler_Filename + "@" + #PB_Compiler_Line + ")", "FAIL", #MB_OK | #MB_ICONERROR)
  63.   End 1
  64. EndMacro ;}
  65.  
  66. ;; ЗАМОРАЖИВАЕТ ЛИБО РАЗМОРАЖИВАЕТ ВСЕ ПОТОКИ ПРОЦЕССА
  67. ;; ProcessID     ID ПРОЦЕССА
  68. ;; Action        УСТАНОВИТЬ В #PROC_SUSPEND ДЛЯ ЗАМОРОЗКИ, ИЛИ В #PROC_RESUME ДЛЯ РАЗМОРОЗКИ
  69. ;; @Returns: -1 ПРИ НЕУДАЧЕ С ПОЛУЧЕНИЕМ ХЕНДЛОВ, -2 ПРИ НЕУДАЧЕ ЗАМОРОЗКИ/РАЗМОРОЗКИ,
  70. ;;           ИНАЧЕ КОЛИЧЕСТВО ЗАМОРОЖЕННЫХ/РАЗМОРОЖЕННЫХ ПОТОКОВ
  71. Procedure ProcThreadsSuspendResume(ProcessID.w, Action.b)
  72.   Protected *ThreadSnapshot, *ThreadHandle
  73.   Protected ThreadEntry.THREADENTRY32
  74.   Protected ProcessedCount = 0
  75.  
  76.   *ThreadSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, #Null)
  77.   ThreadEntry\dwSize = SizeOf(THREADENTRY32)
  78.  
  79.   If *ThreadSnapshot = #INVALID_HANDLE_VALUE
  80.     ProcedureReturn -1
  81.   EndIf
  82.  
  83.   If Thread32First_(*ThreadSnapshot, @ThreadEntry)
  84.     Debug #PB_Compiler_Procedure + ":Begin search threads in process #" + ProcessID
  85.     Repeat
  86.       If ThreadEntry\th32OwnerProcessID = ProcessID
  87.         Debug #PB_Compiler_Procedure + ":    Found thread #" + ThreadEntry\th32ThreadID
  88.         *ThreadHandle = OpenThread(#THREAD_ALL_ACCESS, #False, ThreadEntry\th32ThreadID)
  89.        
  90.         If Action = #PROC_SUSPEND
  91.           If SuspendThread_(*ThreadHandle) = -1
  92.             Debug #PB_Compiler_Procedure + ":    Failed to suspend thread " + Str(ThreadEntry\th32ThreadID)
  93.             ProcedureReturn -2
  94.           Else
  95.             ProcessedCount + 1
  96.           EndIf
  97.          
  98.         ElseIf Action = #PROC_RESUME
  99.           If ResumeThread_(*ThreadHandle) = -1
  100.             Debug #PB_Compiler_Procedure + ":    Failed to resume thread " + Str(ThreadEntry\th32ThreadID)
  101.             ProcedureReturn -2
  102.           Else
  103.             ProcessedCount + 1
  104.           EndIf
  105.         EndIf
  106.        
  107.         CloseHandle_(*ThreadHandle)
  108.       EndIf
  109.     Until Not Thread32Next_(*ThreadSnapshot, @ThreadEntry)
  110.     Debug #PB_Compiler_Procedure + ": " + ProcessedCount + " threads processed"
  111.   Else
  112.     CloseHandle_(*ThreadSnapshot)
  113.     ProcedureReturn -1
  114.   EndIf
  115.  
  116.   CloseHandle_(*ThreadSnapshot)
  117.   ProcedureReturn ProcessedCount
  118. EndProcedure
  119.  
  120. Procedure SuspendOrResume(Action.b)
  121.   Protected *ProcSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, #Null)
  122.   Protected ProcessEntry.PROCESSENTRY32
  123.   Protected *szExeFile, *pString.String
  124.   Protected ProcFound.i = 0
  125.   Protected Result = #False
  126.   ProcessEntry\dwSize = SizeOf(PROCESSENTRY32)
  127.  
  128.   If Process32First_(*ProcSnapshot, @ProcessEntry)
  129.     While Process32Next_(*ProcSnapshot, @ProcessEntry)
  130.       *szExeFile = @ProcessEntry\szExeFile
  131.       *pString = @*szExeFile
  132.       If *pString\s = "BafflerStandalone3.exe" Or *pString\s = "Transformice.exe"
  133.         ProcFound + 1
  134.         Debug *pString\s + " PID: " + Str(ProcessEntry\th32ProcessID)
  135.         If ProcThreadsSuspendResume(ProcessEntry\th32ProcessID, Action) > 0
  136.           Result = #True
  137.           If Action = #PROC_RESUME
  138.             PlaySound(#SOUND_RESUME)
  139.             ChangeSysTrayIcon(TrayIcon, ImageID(#IMG_ICO_CHEESE))
  140.             SysTrayIconToolTip(TrayIcon, #TRAY_TOOLTIP_NOTSUSPENDED$)
  141.           Else
  142.             PlaySound(#SOUND_SUSPEND)
  143.             ChangeSysTrayIcon(TrayIcon, ImageID(#IMG_ICO_CHEESEPAUSE))
  144.             SysTrayIconToolTip(TrayIcon, #TRAY_TOOLTIP_SUSPENDED$)
  145.           EndIf
  146.         Else
  147.           PlaySound(#SOUND_FAIL)
  148.         EndIf
  149.       EndIf
  150.     Wend
  151.    
  152.     If ProcFound = 0
  153.       PlaySound(#SOUND_IDLE)
  154.     EndIf
  155.   Else
  156.     FailWithMsgLineNumber("Process32First failed")
  157.   EndIf
  158.  
  159.   CloseHandle_(*ProcSnapshot)
  160.   ProcedureReturn Result
  161. EndProcedure
  162.  
  163. Procedure HotKeyThread(*Value)
  164.   Protected Msg.MSG
  165.   Protected Suspended.b = #False
  166.  
  167.   If Not RegisterHotKey_(#Null, 0, #MOD_ALT | #MOD_NOREPEAT, #VK_Q)
  168.     FailWithMsgLineNumber("Failed register hotkey 0")
  169.   EndIf
  170.   If Not RegisterHotKey_(#Null, 1, #MOD_ALT | #MOD_NOREPEAT, #VK_W)
  171.     FailWithMsgLineNumber("Failed to register hotkey 1")
  172.   EndIf
  173.  
  174.   Repeat
  175.     GetMessage_(@Msg, #Null, #WM_HOTKEY, #WM_HOTKEY)
  176.     Debug "Message " + Str(Msg\lParam)
  177.     If Msg\message = #WM_HOTKEY
  178.       If Msg\wParam = 0
  179.         If Suspended = #True
  180.           If SuspendOrResume(#PROC_RESUME)
  181.             Suspended = #False
  182.           EndIf
  183.         EndIf
  184.       ElseIf Msg\wParam = 1
  185.         If Suspended = #False
  186.           If SuspendOrResume(#PROC_SUSPEND)
  187.             Suspended = #True
  188.           EndIf
  189.         EndIf
  190.       EndIf
  191.     EndIf
  192.   ForEver
  193. EndProcedure
  194.  
  195. Procedure InitLoadResources()
  196.   If InitSound()
  197.     UseOGGSoundDecoder()
  198.    
  199.     If Not CatchSound(#SOUND_SUSPEND, ?lbSndOn, ?lbEndData - ?lbSndOn)
  200.       MessageRequester("ERROR", "Can't load SOUND_SUSPEND")
  201.       End 1
  202.     EndIf
  203.     If Not CatchSound(#SOUND_FAIL, ?lbSndFail, ?lbSndOn - ?lbSndFail)
  204.       MessageRequester("ERROR", "Can't load sound SOUND_FAIL")
  205.       End 1
  206.     EndIf
  207.     If Not CatchSound(#SOUND_RESUME, ?lbSndOff, ?lbSndFail - ?lbSndOff)
  208.       MessageRequester("ERROR", "Can't load sound SOUND_RESUME")
  209.       End 1
  210.     EndIf
  211.     If Not CatchSound(#SOUND_IDLE, ?lbSndIdle, ?lbSndOff - ?lbSndIdle)
  212.       MessageRequester("ERROR", "Can't load sound SOUND_IDLE")
  213.       End 1
  214.     EndIf
  215.   EndIf
  216.  
  217.   If Not CatchImage(#IMG_ICO_CHEESE, ?lbIcoCheese, ?lbSndIdle - ?lbIcoCheese)
  218.     MessageRequester("ERROR", "Can't load image IMG_ICO_CHEESE")
  219.   EndIf
  220.   If Not CatchImage(#IMG_ICO_CHEESEPAUSE, ?lbIcoCheesePause, ?lbIcoCheese - ?lbIcoCheesePause)
  221.     MessageRequester("ERROR", "Can't load image IMG_ICO_CHEESEPAUSE")
  222.   EndIf
  223. EndProcedure
  224.  
  225. Procedure InitTrayMenu()
  226.   TrayWindow = OpenWindow(#PB_Any, 0, 0, 150, 250, "Tray", #PB_Window_Invisible)
  227.   TrayWindowID = WindowID(TrayWindow)
  228.   TrayIcon = AddSysTrayIcon(#PB_Any, TrayWindowID, ImageID(#IMG_ICO_CHEESE))
  229.   TrayMenu = CreatePopupMenu(#TRAY_MENU)
  230.  
  231.   SysTrayIconToolTip(TrayIcon, #TRAY_TOOLTIP_NOTSUSPENDED$)
  232.   MenuItem(#MENU_ITEM_EXIT, "Выход")
  233. EndProcedure
  234.  
  235. ;- =========== MAIN ===========
  236.  
  237. Define Event, EventType, HotKeyThreadHandle
  238. InitLoadResources()
  239. InitTrayMenu()
  240.  
  241. HotKeyThreadHandle = CreateThread(@HotKeyThread(), 0)
  242. If Not HotKeyThreadHandle
  243.   FailWithMsgLineNumber("Failed to create hot key thread")
  244. EndIf
  245.  
  246. Repeat
  247.   Event = WaitWindowEvent()
  248.   EventType = EventType()
  249.  
  250.   Select EventType
  251.     Case #PB_EventType_RightClick
  252.       DisplayPopupMenu(#TRAY_MENU, TrayWindowID)
  253.   EndSelect
  254.  
  255.   If Event = #PB_Event_Menu
  256.     Select EventMenu()
  257.       Case #MENU_ITEM_EXIT
  258.         KillThread(HotKeyThreadHandle)
  259.         End 0
  260.     EndSelect
  261.   EndIf
  262. ForEver
  263. ; IDE Options = PureBasic 5.40 LTS (Windows - x86)
  264. ; CursorPosition = 243
  265. ; FirstLine = 182
  266. ; Folding = 89
  267. ; EnableXP
  268. ; EnableCompileCount = 105
  269. ; EnableBuildCount = 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement