Win32 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
>;

Один раз хорошенько продумав и написав такой класс вы облегчите себе жизнь и будете больше времени уделять обучению и оттачиванию навыков чем написанию одного и того же каждый раз. Тем более, я считаю это очень полезно — самому сделать такой класс и дополнять его по необходимости.

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Microsoft Windows API

Содержание

Общие сведения

Работа через Windows API — это наиболее близкий к операционной системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model.

Windows API представляет собой множество функций, структур данных и числовых констант, следующих соглашениям языка Си. Все языки программирования, способные вызывать такие функции и оперировать такими типами данных в программах, исполняемых в среде Windows, могут пользоваться этим API. В частности, это языки C++, Pascal, Visual Basic и многие другие. Эти функции в свою очередь могут быть разбиты на следующие основные категории:

История Microsoft API

Microsoft прилагает усилия, чтобы сохранить обратную совместимость. Для достижения этой цели при разработке новых версий Windows, Microsoft иногда реализует обходные пути, чтобы обеспечить совместимость с программным обеспечением сторонних производителей, которые использовали предыдущую версию незарегистрированным или даже нецелесообразным способом.

Обзор

Функции, предоставляемые Windows API, могут быть представлены следующим образом:

Взаимодействие программ

Версии Windows API

Почти каждая новая версия Microsoft Windows представила свои собственные дополнения и изменения в Windows API.

Мультимедиа

Microsoft также предоставляет несколько интерфейсов API для кодирования медиа и воспроизведения:

Источник

начало работы с настольными 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 см. в статье индексы функций и технологий.

Источник

наборы 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): Компилируем: Запускаем:
Win32 api что это. . Win32 api что это фото. Win32 api что это-. картинка Win32 api что это. картинка

Кроме того, компилятору и компоновщику нужно сообщить о том, что вы делаете графическое приложение. Для bcc32 это опция -tW: Win32 api что это. . Win32 api что это фото. Win32 api что это-. картинка Win32 api что это. картинка

Если же вы соскучитесь по черному консольному окошку, его можно в любой момент создать при помощи вызова 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):
Win32 api что это. appwnd. Win32 api что это фото. Win32 api что это-appwnd. картинка Win32 api что это. картинка appwnd

Меню, строка заголовка с системными кнопками, системное меню, рамка изменения размеров и полосы прокрутки относятся к области окна, называемой неклиентской областью (non-client area). С неклиентской областью Windows справляется сама, а вот за содержимое и обслуживание клиентской области отвечает приложение.

Программа для Win32 обычно состоит из следующих блоков:

Класс регистрируется при помощи функции: При успешном завершении функция возвращает целочисленный код, соответствующий строке-имени класса в общесистемной таблице строк (такой код называется атомом). При ошибке возвращается 0.

Для создания окна вызывается функция:

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

Процедура обработки событий не должна игнорировать сообщения. Если процедура не обрабатывает какое-то сообщение, она должна вернуть его системе для обработки по умолчанию. Для этого вызывается функция:

Все описанное в данном параграфе суммируется в примере 4 (example4.cpp):

Приведенный пример создает окно с кнопкой «My button», при нажатии на которую вылезает окно-сообщение:
Win32 api что это. . Win32 api что это фото. Win32 api что это-. картинка Win32 api что это. картинка

Эти ресурсы можно внедрить в виде шестнадцатеричных кодов непосредственно в файл ресурсов:

Следует отметить, что первая иконка в ресурсах будет использоваться «Проводником» как иконка исполняемого файла.

Для закрепления полученных сведений, давайте добавим к примеру 4 какую-нибудь иконку и такое меню:
Win32 api что это. menus. Win32 api что это фото. Win32 api что это-menus. картинка Win32 api что это. картинка menus

Для этого создаем файл ресурсов (example4a.rc):

Для перевода файла описания ресурсов в бинарный вид используется компилятор ресурсов Borland Resource Compiler: В результате получается файл example4a.res, который потребуется в процессе компоновки.

В примере 4 надо изменить строки на

Чтобы программа не была такой скучной, изменим обработчик сообщения WM_COMMAND : В результате при выборе того или иного пункта меню выводится окно-сообщение с кодом команды.

Теперь компоновка программы будет более сложной, поэтому bcc32 с этой задачей не справится. В этом примере компилятор будет использоваться только для компилирования (запускаем с ключом ): В результате получаем объектный файл example4a.obj.

Итак, компонуем модифицированный пример 4:

Эта же иконка отображается в строке заголовка главного окна программы. Под строкой заголовка отображается созданное нами меню. При выборе любой команды меню появляется окно-сообщение с кодом команды. При выборе команды «Exit» программа завершается.
Win32 api что это. . Win32 api что это фото. Win32 api что это-. картинка Win32 api что это. картинка

Если написать подходящий сценарий компиляции, то для компиляции вашего проекта придется набирать лишь команду:

Большинство приложений использует диалоговые окна для запроса у пользователя дополнительной информации для выполнения каких-либо команд. Например, команда открытия файла требует указания имени файла, так что приложение создает диалоговое окно, чтобы запросить у пользователя имя файла. Пока пользователь не укажет имя файла, команда не будет выполнена. После этого программа уничтожает это диалоговое окно. В этом случае используется модальное диалоговое окно. Другой пример: текстовый редактор может использовать немодальное диалоговое окно, для команды поиска. Пока редактор ищет введенную фразу, диалоговое окно остается на экране. Более того, пользователь может вернуться к редактированию текста, не закрывая диалог поиска. Либо пользователь может ввести другую фразу для поиска. Такое диалоговое окно остается открытым, пока приложение не завершится или пользователь непосредственно не выберет команду закрытия этого диалога.

Чтобы создать диалоговое окно, приложение должно предоставить системе шаблон диалога, описывающий содержание и стиль диалога, и диалоговую процедуру. Диалоговая процедура выполняет примерно такие же задачи, что и процедура обработки событий окна. Диалоговые окна принадлежат к предопределенному классу окон. Windows использует этот класс и соответствующую процедуру обработки событий для модальных и немодальных диалогов. Эта процедура обрабатывает одни сообщения самостоятельно, а другие передает на обработку диалоговой процедуре приложения. У приложения нет непосредственного доступа к этому предопределенному классу и соответствующей ему процедуре обработки событий. Для изменения стиля и поведения диалога программа должна использовать шаблон диалогового окна и диалоговую процедуру.

Немодальное диалоговое окно появляется поверх указанного в качестве родительского окна, но не блокирует его. Диалоговое окно остается поверх родительского окна, даже если оно неактивно. Программа сама отвечает за отображение/сокрытие окна (с помощью стиля WS_VISIBLE и функции ShowWindow ). Сообщения для немодального диалогового окна оказываются в основной очереди сообщений программы. Чтобы эти сообщения были корректно обработаны, следует включить в цикл обработки сообщений вызов функции:

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

Шаблон диалогового окна в ресурсах задается следующим образом:

После заголовка блока идет ряд необязательных операторов-параметров диалога (property-statements) в любом порядке:

Вот пример диалога, содержащего простое статическое текстовое поле и кнопку «OK»:

Добавим этот диалог к ресурсам примера 4. В текст программы добавим две глобальных переменных:

Изменим обработчик сообщения WM_COMMAND следующим образом:

Теперь в текст программы необходимо добавить диалоговую процедуру:

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

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

Для функции отсылки сообщений есть специальный вариант, предназначенный для более удобной работы с управляющими элементами:

Кроме предопределенных управляющих элементов, Windows предоставляет еще набор стандартных управляющих элементов посредством библиотеки Common Controls Library (COMCTL32.DLL). Чтобы воспользоваться ей, в тест программы надо включить заголовочный файл commctrl.h и добавить в блок инициализации программы вызов функции:

Ресурсы значительно облегчают работу программиста по созданию интерфейса программы, поэтому весьма привлекательно использовать ресурсы для описания главного окна. Это возможно в случае, если главное окно реализовано в виде немодального диалога.

Пример 5 демонстрирует использование немодального диалога в приложении типа «блокнот».

Файл example5.h содержит константы-идентификаторы команд меню и элементов диалога.

Файл example5.rc описывает ресурсы программы: иконку, меню и шаблон диалога.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *