FreeBasic
Главная
Вход
Регистрация
Суббота, 18.04.2026, 00:11Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Панель быстрого запуска, как добраться до её свойств?
DarkDemonДата: Понедельник, 13.04.2026, 19:50 | Сообщение # 16
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
Выдрал куски из кода от Стаса и потестил, в общем надо колупать, ArtMoney находит ~1500 кусков.
По дефолту без отсейки около 3000 кусков памяти.

Но Стас применяет такое сито:

Код
(MBI.Protect = PAGE_READWRITE) AND ((MBI.State = MEM_COMMIT) OR (MBI.State = MEM_RESERVE))
Это даёт примерно 900 кусков.

Вроде бы мне много и не надо, навскидку нужный регион памяти в первых 20-ти кусках.
Но 900 это не 1500. Если так прикинуть, то можно что-то и пропустить, хотя не очень это и вероятно.
Наверное ArtMoney лезет дальше чем просто заведённая юзерская память. Не знаю. Немного всё это настораживает.
Хотя работать по сути и должно. Колупаю короче и так и сяк.

Цитата
У меня вообще эта панель сбоку слева + автоскрытие. Чтобы не отнимала полезное пространство монитора,
которого всегда не хватает.

Круто что приучил себя. У меня не вышло, раньше пробовал автоскрытие. Не понравилось что, постоянно,
случайно заводишь туда на эти пиксели мышку и вылезает, отвлекая, ну и панель задач дёргаю часто,
издержки появляются. А так фича, конечно, интересная, специфичная.
 
haavДата: Понедельник, 13.04.2026, 21:45 | Сообщение # 17
Генералиссимус
Группа: Администраторы
Сообщений: 1463
Репутация: 50
Статус: Offline
Цитата DarkDemon ()
(MBI.Protect = PAGE_READWRITE) AND ((MBI.State = MEM_COMMIT) OR (MBI.State = MEM_RESERVE))


Попробуй заменить на это:

Код
If (MBI.Protect and PAGE_READWRITE) = PAGE_READWRITE then
    if (MBI.State and MEM_FREE) <> MEM_FREE then
        
    EndIf
EndIf


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Вторник, 14.04.2026, 00:49 | Сообщение # 18
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
Цитата haav ()
Попробуй заменить на это:

~1000 кусков

Да вот честно не понимаю по какому принципу отсеивает ArtMoney. Может они лоханулись))) хрен его знает.
Но флагов там не так много. Или может они проверяют куски и если есть идущие друг за другом - они их в один сливают.
Фиг знает. Но вот если просто взять и пробежаться по всем 3000 кускам, попробовать открыть процесс и сделать

Код
ReadProcessMemory(hproc, CAST(ANY PTR, MBI.BaseAddress), Buf, MBI.RegionSize, @BytesDo)

то по последнему параметру понятно сколько байт скопировалось и реально открываются 1980 кусков.
Если поставить условие что BytesDo = MBI.RegionSize, то фактически столько же (на 3 меньше).
 
DarkDemonДата: Вторник, 14.04.2026, 01:43 | Сообщение # 19
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
В общем прогресс понемногу идёт...

Повторов ширины три раза через 8 байт оказалось немного. Поиск занимает примерно секунду на моём ПК.
Но там ещё вполне можно оптимизировать малой кровью. Т.е. новости хорошие.
Осталось найти стабильные сигнатуры для привязки в модуле. И можно собирать рабочий экземпляр.
Пока решил проверять все, почти 2000 кусков. Пусть это и избыточно, но главное чтобы находило во что бы то ни было.

Можно находить первую и останавливаться, тогда вообще там миллисекунды на поиск, можно опционально сделать
галочкой в настройках или искать первую и если проверка не валидна - то искать дальше...
Хотя немного удивлён что ещё нашлись подобные совпадения(всё таки вероятность редка) - но думаю это не будет проблемой.

Добавлено (14.04.2026, 20:53)
---------------------------------------------
В общем стратегия чекинга "плюс единица" работает, но есть нюансы.
1) Надо после чека сразу делать минус единицу, чтобы для программы ничего не менялось.
2) GetWindowRect ( hQuickLaunch, @Razm ) сам по себе кривой. Одно дело корректировать когда все иконки отображаются,
но когда часть иконок не влезает - этот RECT меняет свой размер и если вы понимаете о чём пишу, то вариантов
может быть три: все иконки влезают, одна не отображается, две не отображаются. Что означает что чекинга надо
делать аж целых три(потому что первичное значение ширины по которому ищем берётся с этого RECT-а).
Ко всему этому добавляестся изменение размера RECT-а при закреплении\откреплении панели задач.
Это блин FULL ASS! Задолбаюсь это хардкодить. И на самом деле не проблема даже если проверок будет x6,
т.к. проверил, скомпилил с оптимизацией, ускорение очень большое. Но вот как всё это вычислить и закодить не запутавшись.
Думаю гораздо приятнее было бы просто находить эту панель по сигнатурам. Или как-то более надёжно получить
размер этой панели, который бы не менялся (тут есть один вариант, буду пробовать получитьт RECT всего ReBar-а
и потом уже вычитать из него ширину RECT-а TaskBar-а).

Но до сигнатур пока не дошёл, так вроде одну видел, за которую можно зацепиться, но надо чекать на разных компах.

Добавлено (14.04.2026, 21:48)
---------------------------------------------

Цитата
И на самом деле не проблема даже если проверок будет x6

Короче проверять ширину ReBar-a и ширину TaskBar-a оказалось не просто хорошим вариантом, а необходимостью.
Т.к. выгоднее проверить их позиции, чтобы в случае если у пользователя всё не так - просто терминировать прогу.
И в данном случае это не просто защищает от запуска на "кривой системе" без панели быстрого запуска, но и
сокращает неопределённое количество проверок до строго определённых двух (размеры на AERO ещё не смотрел,
но даже если они отличаются - можно просто проверить включен ли Aero и вычислить правильные два размера).

И хорошая стратегия следующая:
Вычисляем два этих размера, ищем адреса, составляя два списка по ним. Далее начинаем проверку,
берём адрес из первого списка, чекаем, потом адрес из второго списка, чекаем и т.д. попеременно то из
первого то из второго списка. По идее сработать должен один из первых адресов списков. Если этого не произошло,
тогда проверяем весь список(тут уже можно поставить ограничение на процент проверок).

Думаю это и есть +/- нормальный вариант для простенькой утилиты, чтобы не наворачивать монстра с кучей проверок.
Чтобы обойтись без проверки очереди сообщений можно создать ScreenRes окно в один пиксель с одной страницей
видеопамяти, что заставит его делать автообновление, получить его HWND и задизеблить, это даст минимум кода.
Прикрепления: 0226047.png (57.0 Kb)
 
DarkDemonДата: Среда, 15.04.2026, 18:19 | Сообщение # 20
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
Итак вкратце.

Весь код написан, но он не работает из-за двух строчек кода в сканировании памяти.
Парадокс заключается в следующем, вот этот код.

Код
   '   Открываем процесс с целью запроса информации
   PID_RW = OpenProcess(PROCESS_QUERY_INFORMATION, 0, Exp_ID)

   CLS
   PRINT "Size1 = "; Size1
   PRINT "Size2 = "; Size2

     '   Пробежимся по всем найденным адресам
     WHILE VirtualQueryEx (PID_RW, Address, @MBI, dwLen) <> 0

       Hp = OpenProcess(process_all_access, 0, Exp_ID)   '  Открыть процесс
       '  Если процесс открылся
       IF Hp THEN
         '  Заводим память
         Buf = Allocate(MBI.RegionSize + 1)
         BytesDo = 0
         '  Читаем память
         ReadProcessMemory(Hp, CAST(ANY PTR, MBI.BaseAddress), Buf, MBI.RegionSize, @BytesDo)

         '  MBI.RegionSize тип ulongint
         
         '  Если прочитали ВЕСЬ кусок без ограничений
         IF (BytesDo <> 0) AND (BytesDo = MBI.RegionSize) THEN
           Q = Q + 1
           IF Q > 35 THEN EXIT WHILE    '  Пропустим ненужные куски
           '  Ищем в памяти       
           FOR i = 0 TO MBI.RegionSize - 133  '- 128 - 4 - 1

              IF MBI.BaseAddress = &H368000 THEN
              
                 GetV1 = PEEK(LONG, Buf + i)

                 IF GetV1 = Size2 THEN
                   PRINT "Adr: "; i, GetV1
                   GetV2 = PEEK(LONG, Buf + i + 8)
                   GetV3 = PEEK(LONG, Buf + i + 128)
                   PRINT "V2: "; GetV2, " V3: "; GetV3
                 END IF
              END IF

           NEXT i
     WEND


Даёт мне пять адресов:
688159 729944 729952 730020 730080

Сам код подтверждает что все эти значения взятые типом LONG равны Size2 (у меня это 211)
Далее я хочу вытащить со второго параметра третий и пятый.
И мы внезапно узнаём что те значения, которые ТОЛЬКО ЧТО были 211, уже равны
чему-то другому.

И я не понимаю как такое может быть. На вид полный бред. Пруф на скрине.



Может коллеги чего посоветуют в такой ситуации. Но я, если честно, хочу уже всё это бросить.
Или писать нахрен на ассемблере, чтобы точно понимать что тут происходит.

Добавлено (15.04.2026, 18:57)
---------------------------------------------
Короче просто опупел, банально мозг уже устал. Проблема была в относительных вычислениях адресов,
я думал что +128 к первому элементу, а на самом деле после всей десятикратной проверки оказалось что 
ко второму элементу, соотв. третий это уже +136.

Да блин, а я уж подумал, всё, закопался нахрен.

Теперь код работает, он стабилен, лишнего не находит(даже без сигнатур). Всё как и было задумано, как и должно.
Сейчас сделаю дотест на другом ПК с Aero темой, причешу и выложу.

Прикрепления: 6430535.png (10.1 Kb)
 
DarkDemonДата: Среда, 15.04.2026, 21:14 | Сообщение # 21
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
Промежуточный итог темы рабочая версия:

Добавлено (15.04.2026, 21:26)
---------------------------------------------
Но есть нюансы:

1) Не тестировалось на размере шрифта в системе отличного от 100%
2) Предполагается что пользователь закрепит панель(программа работает и с незакреплённой,
но часть иконок будет не видно, это сделано чтобы можно было беспрепятственно откреплять панель).
3) Не тестилось нигде, кроме двух ПК с разными редакциями Win7. Это очень мало чтобы говорить о какой-то
100% работе и стабильности, поэтому всё на ваш страх и риск.
4) Кому надо берите ArtMoney и допиливайте сами под свои настройки. Для меня текущей проги - с лихвой.

Прикрепления: 8294427.zip (74.8 Kb)
 
haavДата: Четверг, 16.04.2026, 05:49 | Сообщение # 22
Генералиссимус
Группа: Администраторы
Сообщений: 1463
Репутация: 50
Статус: Offline
Ради интереса попробовал у себя. К сожалению , не работает. Поморгает панелью и на этом все. Но может у нас , разные OS? У меня 32-bit.
В принципе , лишь бы у тебя работало.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Четверг, 16.04.2026, 10:30 | Сообщение # 23
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
Да у меня обе 64 битки. Чтобы на 32-х сделать надо там через ArtMoney подёргать шторки быстрого запуска
и посмотреть какие значения меняются + интервал между адресами значений. Ещё там важно чтобы размер шрифта
был 100%, т.к. я не учитываю system metrics. 32 битная семёрка ныне это прям раритет.

Алгоритм утилиты следующий:

- Проверяю наличие Aero
- Беру ширину ReBar-a, вычитаю из неё ширину TaskBar-a, получается гипотетическая ширина QuickLaunch + шторки.
Это делается потому что если просто брать ширину QuickLaunch - она кривая из-за возможного сокрытия иконок справа.
- Исходя из включенного или выключенного Aero делаю фиксированные поправки для Size1 и Size2(изначально это
вычисленная выше ширина QuickLaunch), где первое это значение ширины со шторками, а вторая - закреплённая панель.
- Далее лезу в память, если Aero включен - ищу (Size1 или Size2) в виде 2-х отступающих друг от друга на 8 байт, одинаковых
значений. Без Aero значений три: текущий байт, +8 байт и +136 байт.
- Значения сгружается в два списка (первый список - совпадения по Size1, второй список - по Size2)
- Дальше идёт проверка значений, беру поочерёдно из каждого списка адрес и пишу туда то что сейчас там + 1,
обновляю QuickLaunch, снова беру RECT-ы ReBar-а, TaskBar-а, вычисляю ширину, смотрю - если вижу прибавку в 1 пиксель,
значит чек верный и адрес правильный, возвращаю обратно значение т.е. -1 и заканчиваю проверку, если адрес неверный,
то продолжаю чек пока все адреса не проверю.
- По итогу если хоть один чек сработал - запускаю органайзер на удачном адресе.
- Органайзер раз в n миллисекунд (обычно секунда), смотрит директорию QuickLaunch, если кол-во иконок изменилось,
вычисляет ширину в пикселях, пишет её в память и инициирует обновление панели.

В принципе если эту прогу тестить на каждой системе и добавлять в неё условия - можно сделать чтобы на протестированных
редакциях работало. Насчёт system metrics, можно конечно погуглить, но мне этого делать пока не хочется, там я прям
чую что гемор такой сочный, может как-нть потом сделаю. Хотя проще, думаю, перебрать все эти значения 100%, 125%, 150%
и под них уже захардкодить поправки.


Сообщение отредактировал DarkDemon - Четверг, 16.04.2026, 10:38
 
haavДата: Четверг, 16.04.2026, 19:43 | Сообщение # 24
Генералиссимус
Группа: Администраторы
Сообщений: 1463
Репутация: 50
Статус: Offline
Цитата
В принципе если эту прогу тестить на каждой системе и добавлять в неё условия - можно сделать чтобы на протестированных
редакциях работало.

Да ни к чему все это. Ты для себя сделал , все работает. А если кому-то понадобится , алгоритм действий ты описал. Сами разберутся.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Четверг, 16.04.2026, 22:57 | Сообщение # 25
Генерал-майор
Группа: Друзья
Сообщений: 313
Репутация: -1
Статус: Offline
Цитата haav ()
Да ни к чему все это. Ты для себя сделал , все работает. А если кому-то понадобится , алгоритм действий ты описал. Сами разберутся.

Думаю если подогнать ещё под пару 32-х битных - то на семёрках работать будет нормально. Сейчас такая
ситуация, вообще нет свободных компов чтобы воткнуть 7-ки и места на дисках для виртуалок, т.к экстренно
спасал данные с харда(WD Blue на 2TB), даже систему теперь себе переустановить не могу.
Хотя безусловно надо тестить на железе со всеми драйверами, на виртуалках можно в самом конце потестить.

А так да, для себя вопрос закрыл, давно хотел. Если как-то в паблик это выводить то надо тестить на 10-ках.
 
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: