Анонимный комментатор спросил, почему функция
SetWindowsHookEx принимает параметр HINSTANCE, если она всё равно сконвертирует это значение в имя файла.Посмотреть текст целиком...
...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
SetWindowsHookEx принимает параметр HINSTANCE, если она всё равно сконвертирует это значение в имя файла.HHOOK являются не прозрачными типами данных ("чёрным ящиком"), с которыми нужно работать как с описателями, многие программы "знали слишком много, чтобы стать опасными" - и воспользовались тем фактом, что значения HHOOK были просто указателями на предыдущую процедуру ловушки.dllimport, то это указывает компилятору Visual Studio C/C++, что эта функция импортируется из другого (исполняемого) модуля, а не является обычной функцией в этом же исполняемом модуле. Имея на руках эту информацию, компилятор генерирует немного другой код, поскольку теперь он осведомлён об особенностях импортируемых функций.CreateEvent, вы указываете, хотите ли вы создать событие с авто-сбросом (auto-reset event) или с ручным сбросом (manual-reset event).Мы используем мьютекс с фиксированным именем, чтобы определить, не запущена ли уже копия программы. Но это также означает, что злоумышленник может создать мьютекс с таким именем до запуска программы, блокируя, таким образом, запуск нашей программы! Как я могу предотвратить этот тип отказа в обслуживании?
Я умножил 0,619207 на 10'000'000 и получил 6'192'069,999999991 вместо 6'192'070. Это же только шесть цифр; где мои обещанные пятнадцать?
WM_COMMAND всем окнам верхнего уровня (top-level windows). Это одна из вещей, которые настолько очевидно неправильные, что я не понимаю, как кому-то вообще может приходить в голову идея, что это будет работать.MenuHelp - это одна из самых запутывающих функций в библиотеке общих элементов управления. К счастью, вам почти никогда не придётся её использовать, и когда вы узнаете её историю - вы не захотите её использовать.CS_OWNDC и почему изначально это звучит как отличная идея, но после близкого знакомства оказывается, что это больше похоже на ужасную идею.CS_CLASSDC - это то же самое, только хуже. Потому что он берёт все проблемы CS_OWNDC и умножает их.BeginPaint или, если рисование происходит вне цикла рисования, GetDC (хотя вам следует избегать прорисовки вне цикла рисования). Оконный менеджер создаёт для окна DC и возвращает его. Вы используете полученный DC для рисования, а затем восстанавливаете состояние окна, возвращая DC оконному менеджеру вызовом EndPaint (или ReleaseDC). Внутренне, оконный менеджер хранит небольшой кэш DC, который он использует, когда его просят дать DC для окна, и когда DC возвращается - он помещается обратно в кэш (прим.пер.: отдельный кэш каждому потоку, кэш - per-thread). Поскольку оконные DC используются только временно, то число кэшированных DC обычно не сильно велико, так что небольшой кэш достаточен, чтобы удовлетворять запросы на DC в типичной работающей системе.CS_OWNDC в классовых стилях, то оконный менеджер создаст DC для окна и поместит его в кэш, пометив специальным флагом "Не удалять этот DC из кэша, потому что он принадлежит окну с CS_OWNDC". Если вы вызовите BeginPaint или GetDC для получения DC окна со стилем CS_OWNDC, то этот DC всегда будет найден в кэше и всегда будет помещаться обратно в него (потому что он был помечен "никогда не удалять"). Из этого есть следствия: хорошие, плохие и ещё хуже.
В этом блоге подписка на основной раздел и раздел переводов сделана раздельно! Ниже - ссылки на подписку для раздела переводов: