С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
1

Python системное программирование

03.05.2018, 14:38. Просмотров 929. Ответов 13
Метки нет (Все метки)

Всем день добрый! Нужна подсказка. Работаю сейчас над screen saver'ом через пайтон в Win7. Использую
Python
1
ctypes.windll.user32.SystemParametersInfoA()
и https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
По типу SPI_GETSCREENSAVEACTIVE и остальное. Дело в том, что
Python
1
ctypes.windll.user32.SystemParametersInfoA()
плохо применяет значения. К примеру, я делаю

Python
1
2
seconds = 1
ctypes.windll.user32.SystemParametersInfoA(win32con.SPI_SETSCREENSAVETIMEOUT, seconds, None, 0)
Работает нормально, каждую секунду афк у меня появляеться скринсейвер и все ок. Но есть одно но - в реестре это значение не изменяеться, оно так и остаеться деофлтными 60 секунд (если я их не менял через UI вручную). А так же при ребуте компа это значение слетает обратно, из 1 секунды в дефолт.

Как сделать так, чтоб
Python
1
ctypes.windll.user32.SystemParametersInfoA()
применяла значения абсолютно нативно? В том числе писала в регистр? Кроме ручного добавления в регистр. Ручным могу и сам сделать.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2018, 14:38
Ответы с готовыми решениями:

Программирование Python
a = 7 b = 5 m = a*b while a != 0 and b != 0: if a > b: a =a% b ...

Программирование на Python в 2-ух томах
Как лучше использовать две книги Лутца (Программирование на Python ы 2-ух...

Динамическое программирование на Python
Помогите, пожалуйста, необходимо очень срочно! модифицировать процедуру...

Обработка естественного языка на Python. Задача на программирование
Здравствуйте! Помогите переписать этот код или же написать полностью новый. Так...

С какого языка начать программирование Pascal или Python?
Извините за вопрос, знаю, что не раз задавали но однозначного ответа я так и не...

13
shsv
413 / 279 / 190
Регистрация: 20.05.2016
Сообщений: 584
03.05.2018, 17:26 2
Лучший ответ Сообщение было отмечено zewer как решение

Решение

В последний параметр нужно передавать SPIF_UPDATEINIFILE.
1
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
03.05.2018, 18:50  [ТС] 3
Цитата Сообщение от shsv Посмотреть сообщение
В последний параметр нужно передавать SPIF_UPDATEINIFILE.
никакого влияния на реестр она не дала , через Windows 7 UI реестр изменяеться сразу же.

Добавлено через 46 минут
Кстати, оказываеться, что флаг
Цитата Сообщение от zewer Посмотреть сообщение
SPIF_UPDATEINIFILE
пишет в реестр по адресу HKEY_USERS/... причем сам скринсейвер берет настройки из HKEY_CURRENT_USER, по этому нужного эфекта это не дает.
0
shsv
413 / 279 / 190
Регистрация: 20.05.2016
Сообщений: 584
03.05.2018, 19:30 4
Хм, но HKEY_CURRENT_USER - ссылка на ветку в HKEY_USERS/..., поэтому эффект должен быть, вроде как...
1
Garry Galler
1607 / 1278 / 483
Регистрация: 28.10.2013
Сообщений: 3,255
03.05.2018, 20:40 5
Лучший ответ Сообщение было отмечено zewer как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def SetScreenSaveTimeout(timeout):
    
    SPIF_SENDWININICHANGE = 0x2    # оповещение всех приложений об изменении настройки при помощи рассылки сообщения WM_SETTINGCHANGE
    SPIF_UPDATEINIFILE = 0x1       # обновление профиля и запись в нем настройки. 
    SPI_SETSCREENSAVETIMEOUT = 0xF # установка таймаута для скринсейвера
    
    
    uiAction = SPI_SETSCREENSAVETIMEOUT
    uiParam = timeout
    pvParam = 0
    fWinIni = SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE
    return ctypes.windll.user32.SystemParametersInfoW(
        uiAction,
        uiParam,
        pvParam,
        fWinIni
    )
 
SetScreenSaveTimeout(122)
print(win32gui.SystemParametersInfo(win32con.SPI_GETSCREENSAVETIMEOUT))
122
Немедленное изменение в реестре
Python системное программирование
2
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
04.05.2018, 00:00  [ТС] 6
Цитата Сообщение от Garry Galler Посмотреть сообщение
Немедленное изменение в реестре
спасибо, можно попросить попробовать поставить таймоут на 5 сек, подождать 5 секунд, получить скринсейвер, выйти из юзера/войти обратно или просто ребутнуть комп, опять посидеть афк 5 секунд, и удостовериться что таймаут на 5 секунд все еще работает правильно даже после ребута ? У меня просто изменялся только один реестр, и после ребута компа настройки откативались к настройкам, которые были до установки.
0
Garry Galler
1607 / 1278 / 483
Регистрация: 28.10.2013
Сообщений: 3,255
04.05.2018, 01:09 7
Цитата Сообщение от zewer Посмотреть сообщение
удостовериться что таймаут на 5 секунд все еще работает правильно даже после ребута
Разумеется работает. Я же на домашнем компе это делаю - и тут я контролирую что и как должно работать.
Если у вас все сбрасывается и комп корпоративный, то удивляться тут нечему.
0
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
04.05.2018, 11:50  [ТС] 8
Цитата Сообщение от Garry Galler Посмотреть сообщение
Если у вас все сбрасывается и комп корпоративный, то удивляться тут нечему.
комп не совсем корпоративный, это виртуалка. Сегодня еще раз проверю все, может чего натупил.

Добавлено через 2 часа 25 минут
Начал копать дальше, в общем да, оно пишет в HKEY_USERS все правильно, но оно не изменяет параметр в HKEY_CURRENT_USER, который в свою очередь являеться подветкой HKEY_USERS, и после релога все подхватываеться из этого пути, т.е. из HKEY_USERS, по этому и слетает.
У вас такого нет ? Путь HKEY_CURRENT_USER/Control Panel/Desktops, ключи ScreenSaverIsSecure, ScreenSaveTimeOut.

Добавлено через 33 секунды
Цитата Сообщение от Garry Galler Посмотреть сообщение
Немедленное изменение в реестре
можно узнать из какого именно пути этот скрин ? )
0
Garry Galler
1607 / 1278 / 483
Регистрация: 28.10.2013
Сообщений: 3,255
04.05.2018, 13:30 9
Цитата Сообщение от zewer Посмотреть сообщение
из какого именно пути этот скрин
Естественно из HKEY_CURRENT_USER\Control Panel\Desktop.
Если у вас виртуалка, значит она так настроена, что настройки текущего пользователя не сохраняются.
Может у него и профиля своего нет: как в линкусе юзер без домашней директории.
1
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
04.05.2018, 13:37  [ТС] 10
Спасибо, судя по всему я разобрался почему так, дело в том, что я исполняю команды на ремоут компе (виртуалке) через наш сервис, и проблема связана с этим, если прямо на виртуалке выполнить команды, то все исполняеться хорошо.

Даже если я через ремоут сервис пишу в HKEY_CURRENT_USER, то оно так же пишет в HKEY_USERS, но это все уже совсем другая история, спасибо за помощь
0
Garry Galler
1607 / 1278 / 483
Регистрация: 28.10.2013
Сообщений: 3,255
04.05.2018, 13:57 11
Цитата Сообщение от zewer Посмотреть сообщение
HKEY_CURRENT_USER, то оно так же пишет в HKEY_USERS
Так и должно быть - у меня тоже в обе ветки пишется: также и в HKEY_USERS\S-1-5-21-ид_юзера-1000\Control Panel\Desktop.
И на диске немедленно изменяется файл ntuser.dat в каталоге пользователя, который, собственно, и является настоящим бинарным файлом реестра и хранит все данные для HKEY_CURRENT_USER.
Впрочем, нюансы удаленного подключения мне незнакомы.
0
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
04.05.2018, 14:14  [ТС] 12
Цитата Сообщение от Garry Galler Посмотреть сообщение
Так и должно быть - у меня тоже в обе ветки пишется
сорри, мой косяк, оно вместо HKEY_CURRENT_USER пишет в HKEY_USERS, а в HKEY_CURRENT_USER ничего не изменяеться.
0
Garry Galler
1607 / 1278 / 483
Регистрация: 28.10.2013
Сообщений: 3,255
04.05.2018, 14:25 13
Возможно, при удаленном подключении используется какой-то особый пользовательский профиль? Вы не проверяли является ли он (сама ветка в HKEY_USERS) именно тем вашим пользователем, для которого вы и делаете изменения?
0
zewer
1732 / 1339 / 167
Регистрация: 07.01.2011
Сообщений: 8,337
Завершенные тесты: 1
04.05.2018, 22:47  [ТС] 14
Garry Galler, уже разобрались, сервис, через который мы работает, стартует с правами выше администратора, с пометкой SYSTEM, и все подобные команды работают не в текущего пользователя, а в дефолтную папку всех пользователей. Я решил работать через реестр, читаю SID текущего пользователя и модифицирую его папку через HKEY_USERS, таким образом и меняется HKET_CURRENT_USER.
0
04.05.2018, 22:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2018, 22:47

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации?...

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код...

Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru