Pull to refresh
51

Погромист

15
Subscribers
Send message
Причем очень несложная причина :-)

Невидимые окна можно создавать и удалять со скоростью во много раз большей чем сможет на них реагировать трей. Всего лишь.

Причем таскбару это не грозит — он отслеживает события активации / деактивации, это достаточно медленный процесс с переводом и обработкой смены фокуса, ввода клавиатуры, обработкой тонны событий в окнах и их содержимом, все эти erasebgnd, перерисовки, вычисления всего и вся (повторить для своих чайлдов рекурсивно), все то что реально происходит при смене активных окон.

Уж обвести рамочку вокруг плашки с иконкой (и опционально текстом) показывающим состояние — оно точно успеет. Более того — оно успевает и thumbnail снять и еще покурить и выпить чашечку кофе :-)

А вот трею надо как-то успевать реагировать (и быстро) на кипящий поток удаляемых окон, и проверять каждое — а оно вообще живо? А оно события от трея ловит? Ну и высчитать в связи с этим что показываем / не показываем, все эти хинты и подсказки, и прочая и прочая. В коде решили упростить (как оно обычно бывает):
    ...
else 
    InvalidateRect(весь трей целиком)

Во время тестирования нашлась-таки целая пачка программ от самого микрософт, которая заставила оный трей безудержно фликерить и выжирать ресурсы.

Потому и решили — вообще убрать, черт-те что получилось. Будем считать это фичей! А вызов кода перенесли на события от мыши.

Прошло двадцать пять лет…

Я полагаю что мой рассказик — весьма похож на реальные события, хотя конечно это только красивая гипотеза.
Это для WH_CBT или WH_CALLWNDPROC требуется внедрение DLL в процессы, и это действительно тяжелая штука.

А я речь веду о вот таком. Специально нашел вам пример на дотнете.

public class SystemProcessHookForm : Form
{
...
    public SystemProcessHookForm()
    {
        // Hook on to the shell
        msgNotify = Interop.RegisterWindowMessage("SHELLHOOK");
        Interop.RegisterShellHookWindow(this.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == msgNotify)
        {
            // Receive shell messages
            switch ((Interop.ShellEvents)m.WParam.ToInt32())
            {
                case Interop.ShellEvents.HSHELL_WINDOWCREATED:
                case Interop.ShellEvents.HSHELL_WINDOWDESTROYED:
                case Interop.ShellEvents.HSHELL_WINDOWACTIVATED:
                    string wName = GetWindowName(m.LParam);
                    var action = (Interop.ShellEvents)m.WParam.ToInt32();
                    OnWindowEvent(string.Format("{0} - {1}: {2}", action, m.LParam, wName));
                    break;
            }
        }
        base.WndProc(ref m);
    }
...
}


Как видите, реализация очень проста, не требует никаких инъекций кода и отдельных DLL (хотя и это тоже достаточно простая штука, закинул свою DLL-ку в реестр и все), и вполне себе работает.

И да, ядро много чего делает для Win32 контекста, в том числе — освобождая ресурсы user/gdi. И в том числе — рассылает и нотификации для top-level windows.

Я даже лет 15 назад пытался делать нечто похожее, чтобы без сервиса и агента в трее, но выглядело это трюкачеством :-)
DestroyWindow function

Destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove the keyboard focus from it…

Это по очевидным причинам — не то :-)
Я на четырех в оной «чигаге» на спор запускал ворд, а в нем вставлял по OLE эксель. Диском шуршало минут пять, но справилось. Причем весь «тюненх» был в том что я убрал нескучную обоину размером 800 на 600 16-бит, и поставил однотонную заливку.
Открываем SetWindowsHookEx, ставим WH_SHELL hook, и ловим HSHELL_WINDOWDESTROYED event.

Появилось с W2k.

Используется explorer, а затем и dwm чтобы перерисовывать таск бар.

Во дела, прошло 20 лет и уже «нет способа» :-)
С учетом того что и так все объекты как ядра, так и Win32, отслеживаются в таблицах процесса ядром системы, то еще один объект USER хранить и обрабатывать — вообще бесплатно.

Тут дело не в этом.

А именно, есть нотификации «окно закрыто» / «окно появилось», чтобы эксплорер свой таск бар отрисовал. Причем неважно — по какой причине окно изчезло. Оно ведь убирается когда прога падает? Вооот!

Вообще, микрософт очень долго требовала наличие невидимых окон в обязательном порядке. Для DDE, для сокетов (кто помнит первую версию WinSock — оценит).

NOTIFYICONDATA nid;
 
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 100;
nid.uVersion = NOTIFYICON_VERSION;
nid.uCallbackMessage = WM_MYMESSAGE;
nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcscpy_s(nid.szTip, L"Tray Icon");
nid.uFlags = NIF_MESSAGE NIF_ICON NIF_TIP;
 
Shell_NotifyIcon(NIM_ADD, &nid);


И для трея оно тоже — есть. То есть чтобы я добавил что-то в трей — мне надо не забыть RegisterClass/CreateWindow. Ну, чтобы банально получать клики по иконке. Кто-то же должен получать WM_TASKBAR_NOTIFY…

А теперь внимание, черный ящик!!! Если эксплорер и так знает все окна в трее, если он и так получает сообщения об их закрытии, то почему он трей при этом не перерисовывает?

Великая тайна, ага.
Чтобы смайлики в BSOD стали еще и анимированными? :-)

Увы, BYOD — и это будет топовый мак про, а ужастик- будет пыль собирать. Раньше на маках сидели только топы, а так — сядут еще и разработчики с тестировщиками.

Зато будет вероятен порт вижуалстудии под мак :-)
читаем КАЖДЫЙ файл в папке

Проверяем прочитанное антивирусом.

Ух, антивирусы это отдельная печаль, причем как раз на открытие файла и ураганят в основном :-)

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

С тех пор парадигма сменилась, лагерь Раймонда Чена с его вниманием к оптимизациям и совместимости давно отодвинут от руля, вперед идут молодые и горячие. Которые выросли в другую эпоху, для них те вещи которые еще 10-20 лет назад были «долго и дорого» — не стоят ничего.

Неплохо бы ставить приоритеты, например, сначала отображаем список файлов, потом подтягиваем подробности


(смеется) а все эти асинхронные и реактивные программирования, весь этот второй рассвет функциональщины, монад и чистых функций — они для чего нужны? Вот именно для этого. Чтобы «само» по очереди, не тормозя остальных.

(в раздумье — ставить тег sarcasm или нет, а то шутка получилась не совсем шуткой)

Async/Await-изация головного мозга (С). Вместо того чтобы делать алгоритм эффективным — его размазывают тонким слоем, и пусть тормозит :-)

Впрочем и ООП (OOA/OOD по Г. Бучу) тоже не для блоатвари придумывалось, а «получилось как всегда» (С).

И чтобы Диспетчер задач можно было вызвать в любой момент, а не по окончании перерисовки всех страниц в Хроме.


Кстати тут вообще элементарно должно было быть, при старте — залочить от свопа пару регионов ОЗУ с кодом и данными, поставить приоритет повыше, и будет всегда мгновенно переключать, тьфу и растереть. Почему нету за столько лет — непонятно.
Примерный сегодняшний алгоритм действий Винды, как я его понимаю.
1. Мы открываем папку в проводнике.
2. Берётся первый файл в списке, смотрится его расширение.
3. Лезем в реестр, посмотреть что там ему соответствует, какая программа.
4. Лезем в эту программу, чтобы взять от неё иконку.
5. Рисуем иконку рядом с именем файла.
GOTO 2 для следующего файла в списке.


Вы забыли еще несколько таких пунктов…

Еще например есть такое
  • мы читаем КАЖДЫЙ файл в папке чтобы определить что это.
  • Если это EXE то мы вытаскиваем иконку из его ресурсов.
  • Если это линк или пиф — то достаем то на что оно ссылается.
  • Если это картинка — то мы читаем ей заголовок, чтобы показать размеры (превью — отдельный шаг!).
  • Если это неизвестный нам файл — то лезем в реестр с проверкой по расширению, и т. д.


А еще есть Icon Overlay extensions. На каждую уже построенную иконку вызывается толпа внешних хэндлеров — вдруг один из них нарисует значок. К слову стрелочка поверх иконы, показывающая что это шорткат — именно так и реализована.

Ну и там еще много чего есть, кастомные column views и т. д. Так что там реально есть чему тормозить.

И это еще выносим за скобки тот факт, что напрямую к файлам эксплорер не ходит, потому что файлы могут быть виртуальными (ага, поддержка зипов, или фтп с вебдавом, или даже обмен файлами из ремот десктопа — именно вот таким провайдером). А еще не забываем что в список «файлов» попадают фавориты, закладки, «последнее», все эти «мое видео» и даже программы из контрол-панели.

Ну и не забываем, что все это тройным слоем обмазано через COM.

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

Вот просто малюсенький примерчик. Смотрим в наш любимый (ну как любимый — был таким до co-signing drivers) IFS Kit, IRP_MJ_CREATE.

The IrpSp->FileObject parameter contains a pointer to the RelatedFileObject field, which is also a FILE_OBECT structure. The RelatedFileObject field of a FILE_OBJECT structure is used to indicate that a given file has been opened relative to an already open file object. This usually indicates that the relative file is a directory


Так вот в обычном конвенциональном file i/o этот самый RelatedFileObject присылал мне в драйвер только этот самый Windows NT Explorer и именно для получения этих самых иконок. Представьте, как надо было (в хорошем смысле) упороться, чтобы даже тут сэкономить пару байтиков и тактиков.

Кстати, задать этот самый каталог отдельным параметром можно исключительно через Native API.
Пост — вообще скрытая реклама far manager / total commander :-)
У меня всего этого нет, ЧЯДНТ?

Очевидно, нет ноутбука с дискретной видеокартой нвидии и встроенной интелевой графикой одновременно, вот и нету проблем с оптимусом, не? А, еще надо странного хотеть, чтобы использовать обе сразу.

Со шрифтами — я там выше по треду расписывал подробно, не всем нравится дефолтный Дроид с агрессивным автохинтером (slight). Впрочем мне точно так же не нравится и ClearType.

А тиринг — проявляется при просмотре тытрубы как правило в многомониторных конфигурациях с разными частотами, при использовании truesync/gsync и всяких там извращений с 4K.
Ну, если брать в облаке мощный проц и платить за него — то хотелось бы платить за мощную работу, а не за обогрев вселенной в «нагрузку», которую устраивают особо ценные сервисы от микрософта :-)

Эти самые +5% облачной утилизации CPU — они все-таки из моего кармана, а не из кармана микрософт. Если бы это было «в подарок из Редмонда» — то не вопрос, пусть коптит, хех…
> Фоновые системные процессы не должны тормозить

Жаль что они об этом не в курсе. Особенно дефендер бесит, причем ладно 10ка — но на серверных редакциях… берешь виртуалку в облаке, чистенькую! И минут 40 куришь, пока дефендер перестанет бушевать. Потом ежель реалтайм запретить, да проредить задачи по шедулеру — уже и жить можно.
— 10ка тормозит! — говорят нам одни
— Да у вас железо тупо слабое! — отвечают другие.

Только одни сидят в «корпоративных полисях», где ничего сменить толком нельзя, а вторые — ехидно вырубили дефендер/касперыч/прочий антивирь с его реалтаймом, снесли поиск и запретили дефрагментер диска, и сидят потирают потные ручонки :-)

Вам не нравятся кошки? Да вы их готовить не умеете (С)…
Причем тут речь пойдет не про апдейты или толщину рамки окна :-)

Тиринг, шрифты, оптимус и прочие закидоны с оборудованием, маразматичные «умолчания» для современных DE…

Но зато нет дефендера и апдейтера, хехе.
Windows 10 — это система наиболее близка к идеалу.

Ммм, я даже добавлю — вообще вся линейка Windows NT именно такова, с точки зрения системщика / погромиста. С момента победной поступи Win32.

Ведь по сути, WinNT с ходу предложила

  • нормальную и развитую многопоточность
  • продвинутую неоклассическую модель секурити (отдельное спасибо за creator owner!)
  • модель множественных рабочих станций и десктопов
  • сквозная юникодизация
  • разные подсистемы на общем ядре
  • единообразный и логичный API, который все еще с нами

На середину-конец 1990х очень немногие системы могли похвастаться столь мощным набором.

Что еще важнее, на этом не остановились и продолжили развитие. Уже в начале нового тысячелетия был осуществлен переход на Win64 (я даже помню WinXP 64bit!), и для нас, погромистов, он был не сказать чтобы безболезненным, но сам WinAPI был явно минимальной головной болью при портировании.

Уже в 90х я самолично клепал кросс-платформенные приложения с Windows NT, причем даже бывали случаи, когда в целевых платформах сами «окошки» вообще отсутствовали. Просто было удобнее.

А удобнее оно было в силу богатейшего функционала, доступного нам, погромистам, «из коробки». Что позволяло нам кастомизировать наше рабочее пространство так, как нам удобнее. ObjectDock и WindowBlinds, множественные десктопы, масса мелких «улучшайзеров»…

И кстати, лично мне редакции Windows Server всегда нравились больше. Так, я предпочитал W2k3 всенародно любимой WinXP, W2k8 — вместо висты/7, а Win2k16 — вместо Windows 8/10. При наличии подписки на MSDN — можно и шикануть :-)

Дело однако в том, что (на мой вкус, разумеется) при столь мощном фундаменте лично мне нововведения в API были «в тему» в те времена, когда появился FltMgr. А все остальное — ну, читаю с интересом, но не более того. А, еще когда кернел аудиостриминг открыли, хех. А это было нечто вроде W2k3sp2…

А вот в то же время «поделие финского студента» на месте не стояло, и активнейше развивалось. Вечно там что-то странное бурлило, местами об очередных «нововедениях» комментировал матом, местами — вау, круто.

Но вот итог последних лет десяти — окошки у меня плотно уехали в виртуалку. Не то чтобы я ими не пользуюсь — куда от них денешься, но хостом у меня Linux + KDE, и основной набор софта — в нем же. В окошках — потестить, покрутить, вижуалстудия с индезигном — но и только. Заодно сбылась мечта — много окошек разных конфигураций, переключайся между ними — не хочу…

А происходит (по крайней мере в моем случае) это ровно потому, что широчайшие настройки рабочего места — как-то в окошках стали незаметно усыхать. Элементарные вещи из коробки — начали бесить, а количество действий по настройке окошек — стремительно расти. Если у классической темы Win2k(<8) я менял только фон окна на «слегка серый» и фоном ставил черный цвет без рисунков, то уже в Aero приходилось хорошо так потыкать в палитру, чтобы заголовки активных окон выглядели как у активных окон, но при этом та интерференция, которая получалась — не бесила. В 8/10 — приходится прокликивать половину настроек контрол панели, чтобы отключить «вон то и это» и вернуть взад то к чему привык.

И тенденция — все более угрожающая, да блин я «кеды» так не настраиваю, как окна!

Старею, наверное :-)
Вообще-то — там был прогресс бар сохранения состояния, а не выключенный монитор (он еще и в 7ке есть). Монитор гаснет и продолжает шуршать диском — это уже с 10ки, емнип.

На этом регулярно кстати многие прокалываются — монитор гаснет, шуршит, уходим, утром оба-на! включен и «не шмагла».
Аллилуйя! Неужели наконец-то научили, теперь есть смысл обновляться :-)

Спасибо, какая хорошая новость… я-то обновления забанил (варварски), ибо пользы от них не было, но вишь ты — все-таки польза внезапно есть… Надо будет найти пару часов времени и обновить 10ку на моем traveler notebook.
Вот именно для хрома и электронов мне и пришлось собрать и поставить xsettingsd под линуксом. Ибо на системные настройки гугловый движок плюет с высокой полки.

Я пока про xsettingsd не узнал — натурально упарывался и хрома в сырцах патчил, чтобы он не умничал и свой автохинтинг не включал. Но в электронах (слак, вавйбер, скайп) глазки-то вытекали на клавиатуру (причем в черной теме еще боле-мене, а в белой — бррр).

Information

Rating
Does not participate
Location
München, Bayern, Германия
Date of birth
Registered
Activity