Возможно ли изменять приоритет программ с помощью ВБ?
ps. скоро можно будет сказать что я флужу :)
Вот возник еще один вопрос :) программа работает постоянно и должна работать без приостановок, но при очень сильной нагрузке компьютера(ну к примеру запускаем супер-пупер игру, и ставим все что только в ней можно на максимум), из-за того что у моей программы стандартный приоритет, она выполняется на ряду с другими программами(в нашем случае - игрой), и вызывается частичное заторможенность программы, а это недопустимо. Так вот собственно вопрос - как можно изменть приоритет программы? (предложене руками поменяй в таск манеджере, не принимаются :) )
ps. скоро можно будет сказать что я флужу :)
НЕ нужно ничего менять, просто напиши службу и винда сама будет держать её в рабочем состоянии...
НЕ нужно ничего менять, просто напиши службу и винда сама будет держать её в рабочем состоянии...
какая разница служба или нет? приоритеты никто не отменял для служб, насколько я в курсе...
в вб пользуй функции API, например:
IDLE_PRIORITY_CLASS = &H40
NORMAL_PRIORITY_CLASS = &H20
HIGH_PRIORITY_CLASS = &H80
REALTIME_PRIORITY_CLASS = &H100
End Enum
Const PROCESS_DUP_HANDLE = &H40
Const PROCESS_SET_INFORMATION = &H200
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
для потоков аналогично приоритеты расставляются. надеюсь, ты в курсе как рассчитывается приоритет твоего потока через приоритет процесса и приоритет самого потока...
для потоков аналогично приоритеты расставляются. надеюсь, ты в курсе как рассчитывается приоритет твоего потока через приоритет процесса и приоритет самого потока...
Мдя, где вы такие умные слова находите :))) конечно не в курсе, и вообще как теперь поставить приоритет программы с тем что ты дал?
ps. начал писать то как я пытался поставить приоритет, но понял что то что я делал - это полная чушь...
pss. если влом объяснять, то хоть давайте сллыки по которым можно почитать по вопросу что-нибудь. Так, будто бы тут собрались гении ВБ :) тут таких человек 5-6 всего и все они чаще отвечают на вопросы, чем задают их.
Мдя, где вы такие умные слова находите :))) конечно не в курсе, и вообще как теперь поставить приоритет программы с тем что ты дал?
ps. начал писать то как я пытался поставить приоритет, но понял что то что я делал - это полная чушь...
pss. если влом объяснять, то хоть давайте сллыки по которым можно почитать по вопросу что-нибудь. Так, будто бы тут собрались гении ВБ :) тут таких человек 5-6 всего и все они чаще отвечают на вопросы, чем задают их.
вобщем про потоки и процессы практически в любой книжке про архитектуру Windows найдешь.
Вобщем процесс - это отдельное адресное пространство, определяемое некоторыми атрибутами и ресурсами (ресурсами является и память). Один процесс не может просто так вот взять и использовать ресурсы другого процесса, каждый процесс имеет свой дескриптор и т.п.
Теперь потоки - потоки это куски исполняемого кода в адресном пространстве некоторого потока. Поток принадлежит только одному процессу. Потоки одного процесса могкт пользовать ресурсы этого процесса. Вобщем это контекст...
теперь про приоритеты... приоритеты определяются для потоков, время отводимое каждому потоку (это не совсем точное определение, но для нас сгодится) зависит от его приоритета. Конечный приоритет потока определяется приоритетом процесса и относительным смещением (которое называется приоритетом потока). Всего в Винде различается 32 уровня приоритетов. Есс-но чем выше приоритет, тем реже прерывается поток. Я точно счас не помню какие приоритеты бывают для процесса (по-моему их всего 5), и какие приоритеты бывают для потока (их штук 8, вроде).
Вобщем задаешь приоритет для твоего процесса, потом задаешь приоритет для твоего потока и конечный приоритет исполняемого кода будет приоритет процесса + приоритет потока.
вот, надеюсь что-нить понятно :):)
Const THREAD_BASE_PRIORITY_LOWRT = 15
Const THREAD_BASE_PRIORITY_MIN = -2
Const THREAD_BASE_PRIORITY_MAX = 2
Const THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
Const THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
Const THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
Const THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
Const THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
Const THREAD_PRIORITY_NORMAL = 0
Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
Const HIGH_PRIORITY_CLASS = &H80
Const IDLE_PRIORITY_CLASS = &H40
Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100
Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function GetPriorityClass Lib "kernel32" (ByVal hProcess As Long) As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Sub Form_Load()
Dim hThread As Long, hProcess As Long
'retrieve the current thread and process
hThread = GetCurrentThread
hProcess = GetCurrentProcess
'set the new thread priority to "lowest"
SetThreadPriority hThread, THREAD_PRIORITY_LOWEST
'set the new priority class to "idle"
SetPriorityClass hProcess, IDLE_PRIORITY_CLASS
'print some results
Me.AutoRedraw = True
Me.Print "Current Thread Priority:" + Str$(GetThreadPriority(hThread))
Me.Print "Current Priority Class:" + Str$(GetPriorityClass(hProcess))
End Sub
ps. Еще бы по хуку клавиатуры ответили, я б вообще был бы счастлив :)))
Большое спасибо. Все работает.
ps. Еще бы по хуку клавиатуры ответили, я б вообще был бы счастлив :)))
тебе в смысле как хуки ставятся или что это такое вообще?
тебе в смысле как хуки ставятся или что это такое вообще?
Мне в смысле топик по хуку клавы созданный vitalik-vl'ом("Перехват клавиатуры в Vb"). Только ты немного опоздал :) ответили уже :)
А так как то видел на одном форуме обсуждение по неубиваемым программам. Мысли такие:
Делаем пограмму естественно так, что при получении сообщения типа wm_close нифига она не соберается это делать. Однако это поможет токо от обычного пользователя с мышкой и Alt-F4, от Terminate процесса это конечно не убережет, он ничего спрашивать не будет.
Предлагали еще такой вариант, как запуск вспомогательных процессов 3-4 штуки, которые по таймеру каждую секунду проверяют гл. процесс программы, и при закрытии его - запускают заново(себя тоже). Ставка идет на то, что ни одна другая программа не сможет быстро сделать terminate главному и вспомогательным процессам, чтобы в ее работу не успел вклиниться хотя бы один их вспомогательных, которые опять же восстановит равновесие.
... и при его закрытии - запускают заново ...
Как то было дело - прикол сделал, и в Unload формы вот такую фигню поставил :)
Shell app.path & "\progr.exe", vbNormalFocus
Интересно наблюдать за тем как пытаются закрыть эту программу :) ... жаль только что в ХР оно не работает если выгружают сам процесс...
Ну если вдруг кто-нибудь чего-нибудь нокопает по данному вопросу - киньте сюда.
Интересно наблюдать за тем как пытаются закрыть эту программу :) ... жаль только что в ХР оно не работает если выгружают сам процесс...
Ну, да от Terminate, процесс никто не спасет
В твоем случае, если не хочешь разбираться с получением привилегий SYSTEM (вообще, по идее в защищенной системе это невозможно, мало ли кто захочет себе получить такие привилегии), можно поступить проще - от хакера не спасет, а вот от обычных и менее продвинутых пользователей это поможет:
по запуску прога запускает еще один скрытый процесс(exe прога, со свойствами TaskVisible=False, без GUI и все такое), которая по таймеру, каждую секунду, проверяет наличие гл. проги, и запускает ее заново .... тут токо такой момент - как работает гл. прога? можно ли ее закрывать/запускать или она будет терять при этом данные и важно, чтобы она вообще не прерывалась
==================================================
По запуску прога запускает еще один скрытый процесс(exe прога, со свойствами TaskVisible=False, без GUI и все такое), которая по таймеру, каждую секунду, проверяет наличие гл. проги, и запускает ее заново
Именно так она сейчас и работает :) только пасут ее сразу 2 программы которые также пасут и себя :)
Вот что меня навело на эти привелегии System процессов - не в какую не хочет выгружаться через окно процессов avpcc.exe(AVP, проверят открываемые файлы на вирусы, или что-то в этом роде), ну собственно если Касперский смог такое сделать так почему бы и на ВБ не сделать такое :)))
Вот что меня навело на эти привелегии System процессов - не в какую не хочет выгружаться через окно процессов avpcc.exe(AVP, проверят открываемые файлы на вирусы, или что-то в этом роде), ну собственно если Касперский смог такое сделать так почему бы и на ВБ не сделать такое :)))
вообще-то если написать драйвер, то он будет запускаться как системный... однако написание драйвера на VB - имхо, пока нереализуемая задача.
из чего я сделал вывод, что написать то конечно что-то, чтобы оно висело под SYSTEM можно, но это уже будет точно не программа, а сервис либо драйвер, зарег. определенным образом в системе (со всеми своими радостями и проблемами: стартовать видимо ему придется самому автоматом) и как правильно заметили, не факт, что это можно сделать на VB