Что такое win32 api
наборы API Windows
сведения в этом разделе применимы ко всем версиям Windows 10 и Windows 11. мы будем называть эти версии «Windows», вызывая любые исключения, если это необходимо.
все версии Windows совместно используют общую основу компонентов операционной системы, которая называется основной ос (в некоторых контекстах этот общий базовый метод также называется OneCore). В основных компонентах ОС API Win32 организованы в функциональные группы, которые называются наборами API.
Целью набора API является предоставление архитектурного разделения от библиотеки DLL узла, в которой реализован данный API Win32, и функционального контракта, к которому принадлежит API. Разделение, предоставляемое наборами API между реализацией и контрактами, предоставляет разработчикам множество преимуществ для инженеров. в частности, использование наборов API в коде может улучшить совместимость с Windows устройствами.
Наборы API специально предназначены для следующих сценариев:
хотя все возможности api win32 поддерживаются на компьютерах, на других Windows 10 и (или) Windows 11 таких устройств, как HoloLens, Xbox и другие устройства, доступно только подмножество api win32. Имя набора API предоставляет механизм запросов, позволяющий четко определить, доступен ли API на любом конкретном устройстве.
некоторые реализации API Win32 существуют в библиотеках dll с разными именами на разных Windows устройствах. Использование имен наборов API вместо имен библиотек DLL при обнаружении API доступности и отложенной загрузки API обеспечивает правильный маршрут к реализации независимо от того, где фактически реализован API.
Связывание с библиотеками «тег»
Чтобы упростить ограничение кода интерфейсами API Win32, которые поддерживаются в основной ОС, мы предоставляем ряд библиотек-кодов. например, библиотека с именем-псевдонимом OneCore.lib предоставляет экспорты для подмножества api-интерфейсов Win32, которые являются общими для всех Windows устройств.
API-интерфейсы в библиотеке-области могут быть реализованы в разных модулях. библиотека «тег» абстрагирует эти сведения от вас, делая код более переносимым по сравнению с Windows версиями и устройствами. Вместо связывания с библиотеками, такими как Kernel32. lib и advapi32. lib, просто Свяжите свое классическое приложение или драйвер с библиотекой-символами-разработчиками, которая содержит набор основных API ОС, которые вас интересуют.
дополнительные сведения см. в разделе библиотеки Windowsных библиотек.
Имена контрактов набора API
Наборы API идентифицируются строгим именем контракта, которое соответствует стандартным соглашениям, распознаваемым загрузчиком библиотеки.
Ниже приведены некоторые примеры имен контрактов для наборов API.
За исключением добавления строки .dll в операции загрузчика имена контрактов набора API должны рассматриваться как неизменяемые идентификаторы, соответствующие определенной версии контракта.
Определение наборов API для API-интерфейсов Win32
Чтобы определить, принадлежит ли конкретный API Win32 набору API, ознакомьтесь с таблицей требований в справочной документации по API. если api принадлежит к набору api, в таблице требований в статье перечислены имя набора api и версия Windows, в которой api впервые появился в наборе api. Примеры API-интерфейсов, принадлежащих набору API, см. в следующих статьях:
Основы программирования для Win32 API
Материал рассматривается на примере пакета Borland C++ 5.5 command line tools
Многие компиляторы для Windows «понимают» такую стартовую функцию. Однако при этом они создают хотя и 32-битное, но консольное приложение. Пример 1 (example1.cpp): Компилируем: Запускаем:
Кроме того, компилятору и компоновщику нужно сообщить о том, что вы делаете графическое приложение. Для bcc32 это опция -tW:
Если же вы соскучитесь по черному консольному окошку, его можно в любой момент создать при помощи вызова Win32 API
Окно приложения может содержать строку заголовка title bar (1), строку меню menu bar (2), системное меню system menu (3), кнопку сворачивания окна minimize box (4), кнопку разворачивания окна maximize box (5), рамку изменения размеров sizing border (6), клиентскую область client area (7), горизонтальную и вертикальную полосы прокрутки scroll bars (8):
Меню, строка заголовка с системными кнопками, системное меню, рамка изменения размеров и полосы прокрутки относятся к области окна, называемой неклиентской областью (non-client area). С неклиентской областью Windows справляется сама, а вот за содержимое и обслуживание клиентской области отвечает приложение.
Программа для Win32 обычно состоит из следующих блоков:
Класс регистрируется при помощи функции: При успешном завершении функция возвращает целочисленный код, соответствующий строке-имени класса в общесистемной таблице строк (такой код называется атомом). При ошибке возвращается 0.
Для создания окна вызывается функция:
Процедура обработки событий должна вернуть определенное 32-битное значение, интерпретация которого также зависит от типа сообщения. В большинстве случаев, если сообщение успешно обработано, процедура возвращает значение 0.
Процедура обработки событий не должна игнорировать сообщения. Если процедура не обрабатывает какое-то сообщение, она должна вернуть его системе для обработки по умолчанию. Для этого вызывается функция:
Все описанное в данном параграфе суммируется в примере 4 (example4.cpp):
Приведенный пример создает окно с кнопкой «My button», при нажатии на которую вылезает окно-сообщение:
Эти ресурсы можно внедрить в виде шестнадцатеричных кодов непосредственно в файл ресурсов:
Следует отметить, что первая иконка в ресурсах будет использоваться «Проводником» как иконка исполняемого файла.
Для закрепления полученных сведений, давайте добавим к примеру 4 какую-нибудь иконку и такое меню:
Для этого создаем файл ресурсов (example4a.rc):
Для перевода файла описания ресурсов в бинарный вид используется компилятор ресурсов Borland Resource Compiler: В результате получается файл example4a.res, который потребуется в процессе компоновки.
В примере 4 надо изменить строки на
Чтобы программа не была такой скучной, изменим обработчик сообщения WM_COMMAND : В результате при выборе того или иного пункта меню выводится окно-сообщение с кодом команды.
Теперь компоновка программы будет более сложной, поэтому bcc32 с этой задачей не справится. В этом примере компилятор будет использоваться только для компилирования (запускаем с ключом -с): В результате получаем объектный файл example4a.obj.
Итак, компонуем модифицированный пример 4:
Эта же иконка отображается в строке заголовка главного окна программы. Под строкой заголовка отображается созданное нами меню. При выборе любой команды меню появляется окно-сообщение с кодом команды. При выборе команды «Exit» программа завершается.
Если написать подходящий сценарий компиляции, то для компиляции вашего проекта придется набирать лишь команду:
Большинство приложений использует диалоговые окна для запроса у пользователя дополнительной информации для выполнения каких-либо команд. Например, команда открытия файла требует указания имени файла, так что приложение создает диалоговое окно, чтобы запросить у пользователя имя файла. Пока пользователь не укажет имя файла, команда не будет выполнена. После этого программа уничтожает это диалоговое окно. В этом случае используется модальное диалоговое окно. Другой пример: текстовый редактор может использовать немодальное диалоговое окно, для команды поиска. Пока редактор ищет введенную фразу, диалоговое окно остается на экране. Более того, пользователь может вернуться к редактированию текста, не закрывая диалог поиска. Либо пользователь может ввести другую фразу для поиска. Такое диалоговое окно остается открытым, пока приложение не завершится или пользователь непосредственно не выберет команду закрытия этого диалога.
Чтобы создать диалоговое окно, приложение должно предоставить системе шаблон диалога, описывающий содержание и стиль диалога, и диалоговую процедуру. Диалоговая процедура выполняет примерно такие же задачи, что и процедура обработки событий окна. Диалоговые окна принадлежат к предопределенному классу окон. Windows использует этот класс и соответствующую процедуру обработки событий для модальных и немодальных диалогов. Эта процедура обрабатывает одни сообщения самостоятельно, а другие передает на обработку диалоговой процедуре приложения. У приложения нет непосредственного доступа к этому предопределенному классу и соответствующей ему процедуре обработки событий. Для изменения стиля и поведения диалога программа должна использовать шаблон диалогового окна и диалоговую процедуру.
Немодальное диалоговое окно появляется поверх указанного в качестве родительского окна, но не блокирует его. Диалоговое окно остается поверх родительского окна, даже если оно неактивно. Программа сама отвечает за отображение/сокрытие окна (с помощью стиля WS_VISIBLE и функции ShowWindow ). Сообщения для немодального диалогового окна оказываются в основной очереди сообщений программы. Чтобы эти сообщения были корректно обработаны, следует включить в цикл обработки сообщений вызов функции:
Немодальное диалоговое окно уничтожается, если уничтожается его родительское окно. Во всех остальных случаях программа должна сама заботиться об уничтожении немодального диалогового окна, используя вызов:
Шаблон диалогового окна в ресурсах задается следующим образом:
После заголовка блока идет ряд необязательных операторов-параметров диалога (property-statements) в любом порядке:
Вот пример диалога, содержащего простое статическое текстовое поле и кнопку «OK»:
Добавим этот диалог к ресурсам примера 4. В текст программы добавим две глобальных переменных:
Изменим обработчик сообщения WM_COMMAND следующим образом:
Теперь в текст программы необходимо добавить диалоговую процедуру:
Для многих управляющих элементов определены специальные сообщения, которые управляют видом или поведением таких элементов или позволяют получить параметры их состояния. Как и для любого другого окна эти сообщения можно отправить с помощью функции:
Все упомянутые функции работают с дескриптором окна, который для управляющих элементов в случае создания диалога по шаблону из ресурсов непосредственно неизвестен, но может быть получен по дескриптору диалога и идентификатору управляющего элемента вызовом:
Для функции отсылки сообщений есть специальный вариант, предназначенный для более удобной работы с управляющими элементами:
Кроме предопределенных управляющих элементов, Windows предоставляет еще набор стандартных управляющих элементов посредством библиотеки Common Controls Library (COMCTL32.DLL). Чтобы воспользоваться ей, в тест программы надо включить заголовочный файл commctrl.h и добавить в блок инициализации программы вызов функции:
Ресурсы значительно облегчают работу программиста по созданию интерфейса программы, поэтому весьма привлекательно использовать ресурсы для описания главного окна. Это возможно в случае, если главное окно реализовано в виде немодального диалога.
Пример 5 демонстрирует использование немодального диалога в приложении типа «блокнот».
Файл example5.h содержит константы-идентификаторы команд меню и элементов диалога.
Файл example5.rc описывает ресурсы программы: иконку, меню и шаблон диалога.
начало работы с настольными Windows приложениями, использующими API Win32
в этой документации описывается создание классических Windows приложений с помощью API Win32. Win32 API — это одна из нескольких платформ приложений, которые можно использовать для создания настольных Windows приложений. Дополнительные сведения о других платформах приложений см. в разделе Выбор платформы.
Подготовка
следуйте этим инструкциям и приступите к созданию классических приложений для Windows 10, использующих API Win32.
Если вы хотите создать классическое приложение в пакете MSIX и протестировать или отладить упакованное приложение на компьютере разработчика, необходимо включить режим разработчика на компьютере.
для сценариев, которые можно использовать для настройки компьютера разработки и установки других компонентов или пакетов, ознакомьтесь с этим GitHub проектом.
Узнайте, как создавать классические приложения с помощью API Win32.
Если вы не знакомы с созданием классических приложений с помощью API Win32, ознакомьтесь со следующими учебниками и статьями, которые помогут вам приступить к работе.
Раздел | Описание |
---|---|
Создание первого приложения Win32 на C++ | в этом учебнике описывается написание программы Windows на C++ с помощью api Win32 и COM. |
Создание первого приложения с помощью DirectX | Этот базовый учебник поможет вам приступить к разработке приложений DirectX. |
Руководство по программированию для 64-разрядных версий Windows | описание программирования для 64-разрядных версий операционной системы Windows. |
использование заголовков Windows | содержит общие сведения о некоторых соглашениях, используемых в файлах заголовков Windows. |
Модернизировать классические приложения для Windows 10
если у вас есть существующее приложение Win32 для настольных систем, в универсальная платформа Windows (UWP) имеется множество функций, которые можно использовать для предоставления наилучшего опыта работы на Windows 10. например, начиная с Windows 10 версии 1903 можно размещать элементы управления XAML UWP в приложении Win32 для настольных систем с помощью функции, которая называется «острова xaml».
Большинство этих функций UWP доступны в виде модульных компонентов, которые можно использовать в своем классическом приложении без необходимости перезаписи всего приложения. вы можете усовершенствовать имеющееся классическое приложение, выбрав части Windows 10 и UWP, которые следует принять.
C++/WinRT
При необходимости можно настроить компьютер разработки для использования C++/WinRT. c++/WinRT — это совершенно стандартная современная проекция языка c++ 17 позволяет легко использовать api среда выполнения Windows среда выполнения Windows (WinRT) api из классического приложения Win32 на c++. C++/WinRT реализован в виде библиотеки на основе файлов заголовков.
Чтобы настроить C++/WinRT для проекта, сделайте следующее:
Дополнительные сведения об этом варианте см. в этой статье.
Новые возможности API-интерфейсов Win32 в Windows 10
дополнительные сведения о новых api-интерфейсах Win32, появившихся в Windows 10, см. в разделе новыевозможности.
Приступая к работе с функциями и технологиями Win32
api-интерфейсы Win32 существуют для многих функций и технологий в Windows 10, включая базовые api интерфейса пользователя и оконный интерфейс, аудио и графику, а также сети. Инструкции и примеры кода об использовании этих API см. в статье индексы функций и технологий.
Разбираемся в WinAPI
Для кого эта статья
Эта статья адресована таким же, как и я новичкам в программировании на С++ которые по воле случая или по желанию решили изучать WinAPI.
Хочу сразу предупредить:
Я не претендую на звание гуру по C++ или WinAPI.
Я только учусь и хочу привести здесь несколько примеров и советов которые облегчают мне изучение функций и механизмов WinAPI.
В данной статье я предполагаю что вы уже достаточно ознакомились с С++, что бы уметь создавать классы и перегружать для них различные операторы и что вы уже «прятали» какие-то свои механизмы в класс.
Создание и использование консоли
Для отладки Win32 приложения или просто для того что посмотреть как оно там всё внутри происходит я всегда пользуюсь консолью.
Так как вы создаете GUI приложение, а не консольное, то консоль не подключается. Для того что бы её вызвать в недрах интернета был найден вот этот код
if (AllocConsole())
<
int hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 4);
*stdout = *(::_fdopen(hCrt, «w»));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, «w»));
::setvbuf(stderr, NULL, _IONBF, 0);
std::ios::sync_with_stdio();
>
Для удобства советую обернуть его в функцию. Например:
void CreateConsole()
<
if (AllocConsole())
<
int hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 4);
*stdout = *(::_fdopen(hCrt, «w»));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, «w»));
::setvbuf(stderr, NULL, _IONBF, 0);
std::ios::sync_with_stdio();
>
Вызванная консоль работает только в режиме вывода и работает он также как и в консольных приложениях. Выводите информацию как и обычно — cout/wcout.
Для работоспособности данного кода необходимо включить в прект следующие файлы:
#include
#include #include
и включить пространство имен std в глобальное пространство имён:
using namespace std;
Конечно же, если вы не хотите этого делать, то просто допишите std:: ко всем сущностям которые в ней находятся.
Наследование объектов для вывода и арифм. операций
При создании и изучении самих «окошек» мне всегда требовалось выводить в консоль какое-нибудь значение.
Например:
Вы получаете размер клиентской области окна с помощью функции GetClientRect куда как параметр передается адрес объекта структуры RECT, что бы заполнить этот объект данными. Если вам нужно узнать размер полученной клиентский области вы просто можете вывести его в уже подключённую консоль
Но делать так каждый раз (особенно если вам часто приходиться делать что-то подобное) очень неудобно.
Здесь нам на помощь приходит наследование.
Создайте класс который открыто наследуется от структуры RECT и перегрузите оператор вывода class newrect:public RECT
<
public:
friend ostream& operator
Теперь просто выводите обьект с помощью cout/wcout:
И вам в удобном виде будет выводиться всё так, как вам требуется.
Так же вы можете сделать с любыми нужными вам операторами.
Например, если надо сравнивать или присваивать структуры (допустим тот же RECT или POINT) — перегрузите operator==() и operator=() соответственно.
Если хотите реализовать оператор меньше class BaseWindow
<
WNDCLASSEX _wcex;
TCHAR _className[30];
TCHAR _windowName[40];
HWND _hwnd;
bool _WindowCreation();
public:
BaseWindow(LPCTSTR windowName,HINSTANCE hInstance,DWORD style,UINT x,UINT y,UINT height,UINT width);
BaseWIndow(LPCTSTR windowName,HINSTANCE hInstance);
const HWND GetHWND()const
LPCTSTR GetWndName()const
>;
Один раз хорошенько продумав и написав такой класс вы облегчите себе жизнь и будете больше времени уделять обучению и оттачиванию навыков чем написанию одного и того же каждый раз. Тем более, я считаю это очень полезно — самому сделать такой класс и дополнять его по необходимости.
Get started with desktop Windows apps that use the Win32 API
This documentation covers how to create desktop Windows apps with the Win32 API. The Win32 API is one of several app platforms you can use to build desktop Windows apps. For more info about other app platforms, see Choose your platform.
Get set up
Follow these instructions and start creating desktop apps for Windows 10 that use the Win32 API.
Download or update Visual Studio 2019. If you don’t already have Visual Studio 2019, you can install the free Microsoft Visual Studio Community 2019. When you install Visual Studio, make sure to select the Desktop development with C++ option. For download links, see our Downloads page.
When you install Visual Studio, you can optionally select the .NET desktop development and Universal Windows Platform development options for access to other project types and app platforms for building desktop Windows apps.
If you want to build your desktop app into an MSIX package and test or debug the packaged app on your development computer, you’ll need to enable Developer Mode on your computer.
For scripts you can use to set up your development computer and install other features or packages, check out this GitHub project.
Learn how to create desktop apps using the Win32 API
If you’re new to building desktop apps using the Win32 API, the following tutorials and articles will help get you started.
Topic | Description |
---|---|
Create your first C++ Win32 app | This tutorial teaches you how to write a Windows program in C++ using Win32 and COM APIs. |
Create your first app using DirectX | This basic tutorial will get you started with DirectX app development. |
Programming Guide for 64-bit Windows | Describes programming for 64-bit versions of the Windows operating system. |
Using the Windows Headers | Provides an overview of some of the conventions used in the Windows header files. |
You can also browse the desktop app samples.
Modernize your desktop apps for Windows 10
If you have an existing desktop Win32 app, there are many features in the Universal Windows Platform (UWP) that you can use to deliver the best possible experience on Windows 10. For example, starting in Windows 10, version 1903, you can host UWP XAML controls in your desktop Win32 app using a feature called XAML Islands.
Most of these UWP features are available as modular components that you can adopt in your desktop app at your own pace without having to rewrite your entire application. You can enhance your existing desktop app by choosing which parts of Windows 10 and UWP to adopt.
C++/WinRT
Optionally, you can configure your development computer to use C++/WinRT. C++/WinRT is an entirely standard modern C++17 language projection enables you to easily consume Windows Runtime APIs Windows Runtime (WinRT) APIs from your C++ Win32 desktop application. C++/WinRT is implemented as a header-file-based library.
To configure your project for C++/WinRT:
For more details about these options, see this article.
What’s new for Win32 APIs in Windows 10
To learn about new Win32 APIs that have been introduced in Windows 10, see what’s new.
Get started with Win32 features and technologies
Win32 APIs exist for many features and technologies in Windows 10, including core user interface and windowing APIs, audio and graphics, and networking. For guidance and code samples about using these APIs, see our features and technologies index.