Подтвердить что ты не робот

Самые крутые части 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: Части и состояния
4b9b3361

Ответ 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.

Ответ 8

Вы когда-нибудь хотели проверить, жив ли поток?

DWORD ExitCode;
GetExitCodeThread (Thread, &ExitCode);
if (ExitCode == STILL_ALIVE)
{
    TerminateThread (Thread)
}