Самые крутые части Windows API
Я заметил, что в разделе "Переполнение стека" в языках программирования и API есть немало вики-сообществ о "советах и хитростях" или "Скрытых функциях". Но я не мог найти никаких своих личных фаворитов: Win32 API и Delphi. Поэтому я запускаю свой собственный CW для Win32 API.
Есть (по крайней мере) два вида пользователей Win API: те, которые были созданы с использованием Windows API в C/С++, и те, которые были подняты с использованием некоторого уровня абстракции над Windows API. Я принадлежу к последней категории, воспитываясь с помощью Delphi VCL. Но за последние пять лет меня все больше интересует подстилающий API операционной системы Windows, и сегодня я много работаю с ним.
В зависимости от того, к какой категории принадлежит программист, он (или, возможно, она) подумает, что в Windows API разные вещи "круты". Например, в то время как разработчик, созданный VCL, может подумать, что это очень круто для
var
errIcon: HICON;
begin
errIcon := LoadIcon(0, IDI_ERROR);
DrawIcon(Canvas.Handle, 10, 10, errIcon),
программист, созданный с использованием Windows API в C, не будет впечатлен.
Но как бы вы ни были "воспитаны": какие самые крутые "трюки" в Windows API?
Начну с перечисления нескольких моих собственных фаворитов, некоторые из которых более "круты", чем "полезные", хотя:
-
LoadIcon
иMessageBeep
могут загружать/воспроизводить значки и звуки системы по умолчанию. - Откройте лоток для компакт-дисков:
mciSendString('Set cdaudio door open wait', nil, 0, 0);
- Затухайте экран (Windows Vista и более поздние версии) и выключите монитор:
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
-
GetWindowDC(GetDesktopWindow)
возвращает DC рабочего стола. - Используя
GetSystemMenu
, вы можете добавить/изменить/удалить пункты меню в системном меню окна. Иногда очень приятно. -
DrawThemeBackground
и другие функции сервисов темы, которые позволяют вам нарисовать детали текущей темы, если хотите. Candy: Части и состояния
Ответы
Ответ 2
SendMessage(HWND_BROADCAST, WM_CLOSE, 0, 0);
В значительной степени отключает все приложения, запущенные на вашем компьютере. Приятно наблюдать за действиями, но развертывать с осторожностью... Может быть, это не трюк. Кроме ваших (скоро бывших) друзей.
Ответ 3
Тот факт, что является Windows API.
Мы просто считаем само собой разумеющимся, что существует такая система API, которая позволяет нам делать что-либо в среде Windows. То, что все это позволило создать, и тот факт, что он настолько хорошо документирован (особенно благодаря Charles Petzold), не что иное, как чудесное.
Я использую свое ежедневное кодирование в .NET Framework, и мне нравится, насколько это просто. Но я также знаю, что если я смогу придумать что-то на базе Windows, которое невозможно в управляемом коде .NET, я смогу прорваться через WinAPI и по-прежнему найти способ сделать мой мысленный ребенок возможным.
Ответ 4
WSAAsyncSelect, поэтому вы можете иметь эффективные интерактивные приложения, которые делают сетевые материалы в фоновом режиме, не теряя отзывчивости или не выдерживая многопотоковых головных болей.
И MsgWaitForMultipleObjectsEx. Использование чего-либо еще (GetMessage, PeekMessage) на основе одного основного цикла событий является безумным. И построение структуры с использованием чего-либо еще должно быть незаконным.
Ответ 5
Вы можете найти очень полезный и экономящий время материал, если вы рыскаете в Shell Lightweight Utility API, в частности пути, строковые и потоковые функции.
Ответ 6
Spy ++ и SendMessage позволяют вам делать всевозможные интересные вещи.
Вы можете узнать всю информацию о том, как создаются Windows и любое другое приложение. И вы можете связать их вручную, нажав клавиши. Вы можете найти иерархии окон и отправлять им сообщения. Вы можете сделать что-то вроде закрытия кнопки запуска.
Другим интересным аспектом является windows hooks.
Ответ 7
Точки повторной обработки. Почти похоже на Linux.
Ответ 8
Вы когда-нибудь хотели проверить, жив ли поток?
DWORD ExitCode;
GetExitCodeThread (Thread, &ExitCode);
if (ExitCode == STILL_ALIVE)
{
TerminateThread (Thread)
}