winapi консольное приложение c

Функции API для работы с консолью

Для начала работы с консолью необходимо получить ее дескриптор.

Функция получения дескриптора стандартного устройства ввода, вывода или ошибки в зависимости от переданного константного параметра:
HANDLE WINAPI GetStdHandle(__in DWORD nStdHandle);

nStdHandle может принимать значения

Использование русского языка в консоли с помощью API

Для указания кодовой страницы используются функции

Для перекодировки русского текста, введенного в Win-коде также может использоваться функция

Возвращаемое значение 1 в случае успешной перекодировки.

Чтение/запись данных в консоль/файл

Для чтения и записи данных в консоль используются функции

В случае успешного завершения функции возвращают ненулевое значение.
Аргументы функций

Установка заголовка окна консоли

Функция установки заголовка окна консоли

lpConsoleTitle – указатель на строку имени консоли с завершающим нуль-символом

Установка цвета символов и фона в консоли

Цвет символов и фона задается с помощью констант, определяющих тетрады символов.
Цвет символов

Каждая тетрада, определяющая цвет символов или фона, представляет собой значение от 0 до 15, задаваемая логической суммой соответствующих констант:

console1

Например, цвет символов с кодом 13 задается как

Функция определения атрибутов вводимых символов в окне консоли

Функция, задающая цвет фона консоли(путем закрашивания фона отдельных символов)

Для того чтобы изменить цвет всего окна консоли необходимо задать цвет символов, количество которых определяется размером окна консоли. Размер стандартного окна консоли 80×25 = 2000 символов.

Установка позиции курсора

Функция установки позиции курсора в окне консоли

hConsoleOutput – дескриптор буфера вывода консоли;
dwCursorPosition – структура координат COORD, определяющая позицию курсора.

Структура координат представляет собой

Результат выполнения
2017 01 13 18 09 29

Примечание: для корректной компиляции программы необходимо изменить тип кодировки проекта на многобайтовую.

Источник

пошаговое руководство. создание традиционного Windows классического приложения (C++)

в этом пошаговом руководстве показано, как создать традиционное Windows классическое приложение в Visual Studio. в примере приложения, которое вы создадите, будет использоваться Windows API для вывода «Hello, Windows desktop!». «Hello, World!». Код, созданный в этом пошаговом руководстве, можно использовать в качестве шаблона для создания других классических приложений Windows.

Для краткости в тексте пропущены некоторые операторы кода. В разделе Построение кода в конце документа показан полный код.

Предварительные требования

Компьютер под управлением Microsoft Windows 7 или более поздних версий. Для обеспечения оптимальной среды разработки рекомендуется использовать Windows 10.

desktop development with cpp

Базовые значения об использовании интегрированной среды разработки Visual Studio. Если вы уже использовали классические приложения для Windows, вы, вероятно, справитесь. Общие сведения см. в обзоре возможностей интегрированной среды разработки Visual Studio.

Основные навыки владения языком C++. Не волнуйтесь, мы не будем делать ничего сложного.

создание проекта Windows классических приложений

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

создание проекта Windows desktop в Visual Studio 2019

В главном меню выберите Файл > Создать > Проект, чтобы открыть диалоговое окно Создание проекта.

в верхней части диалогового окна задайте для параметра язык значение C++, задайте для параметра платформа значение Windows и задайте для параметра Project тип значение рабочий стол.

Нажмите кнопку Создать, чтобы создать проект.

desktop app project add new item 153

В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). В поле имя введите имя файла, например хелловиндовсдесктоп. cpp. Нажмите кнопку Добавить.

desktop app add cpp file 153Visual C и плюсом, а также параметр файла c плюсом/с выделенным.» title=»Добавить CPP файл в Десктопапп Project» data-linktype=»relative-path»>

Теперь проект создан и исходный файл открыт в редакторе. Чтобы продолжить, перейдите к созданию кода.

создание проекта Windows desktop в Visual Studio 2017

В меню Файл выберите команду Создать, а затем пункт Проект.

в левой области диалогового окна создание Project разверните узел установленные > Visual C++ и выберите пункт Windows рабочий стол. в средней области выберите мастер рабочего стола Windows.

В поле имя введите имя проекта, например десктопапп. Нажмите кнопку ОК.

desktop app new project name 153Visual C плюс плюс > Windows рабочего стола, выбранный параметр «мастер настольных систем Windows» и десктопапп введено в текстовом поле «имя».» title=»Назовите проект Десктопапп.» data-linktype=»relative-path»>

в диалоговом окне Windows рабочего стола Project в разделе тип приложения выберите Windows приложение (.exe). В поле Дополнительные параметры выберите Пустой проект. Убедитесь, что предварительно скомпилированный заголовок не выбран. Нажмите кнопку ОК, чтобы создать проект.

desktop app project add new item 153

В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). В поле имя введите имя файла, например хелловиндовсдесктоп. cpp. Нажмите кнопку Добавить.

desktop app add cpp file 153Visual C и плюсом, а также параметр файла c плюсом/с выделенным.» title=»Добавить CPP файл в Десктопапп Project» data-linktype=»relative-path»>

Теперь проект создан и исходный файл открыт в редакторе. Чтобы продолжить, перейдите к созданию кода.

создание проекта Windows desktop в Visual Studio 2015

В меню Файл выберите команду Создать, а затем пункт Проект.

в левой области диалогового окна создание Project разверните узел установленные > шаблоны > Visual C++, а затем выберите пункт Win32. В средней области выберите шаблон Проект Win32.

В поле имя введите имя проекта, например десктопапп. Нажмите кнопку ОК.

desktop app new project name 150> Visual C плюс плюс > win32, выделенный параметр win32 Project и десктопапп, введенные в текстовом поле имя.» title=»Назовите проект Десктопапп.» data-linktype=»relative-path»>

На странице Обзор мастера приложений Win32 нажмите кнопку Далее.

desktop app win32 wizard overview 150

на странице Параметры приложений в разделе тип приложения выберите Windows приложение. В разделе Дополнительные параметры снимите флажок предкомпилированный заголовок, а затем выберите пустой проект. Чтобы создать проект, нажмите кнопку Готово.

В Обозреватель решений щелкните правой кнопкой мыши проект десктопапп, выберите Добавить, а затем выберите новый элемент.

desktop app project add new item 150

В диалоговом окне Добавление нового элемента выберите Файл C++ (.cpp). В поле имя введите имя файла, например хелловиндовсдесктоп. cpp. Нажмите кнопку Добавить.

desktop app add cpp file 150Visual C и плюсом, а также параметр файла c плюсом/с выделенным.» title=»Добавить CPP файл в Десктопапп Project» data-linktype=»relative-path»>

Теперь проект создан и исходный файл открыт в редакторе.

Создание кода

далее вы узнаете, как создать код для Windows классического приложения в Visual Studio.

Запуск классического приложения Windows

точно так же, как у каждого приложения C и C++ должна быть main функция в качестве начальной точки, каждое Windows классическое приложение должно иметь WinMain функцию. WinMain имеет следующий синтаксис:

Сведения о параметрах и возвращаемом значении этой функции см. в разделе WinMain Entry Point.

Дополнительные сведения см. в разделе Процедуры окна.

Добавление функциональных возможностей в функцию WinMain

Дополнительные сведения о полях приведенной выше структуры см. в разделе вндклассекс.

зарегистрируйте WNDCLASSEX Windows, чтобы он знал о вашем окне и способах отправки в него сообщений. Воспользуйтесь функцией RegisterClassEx и передайте структуру класса окна в качестве аргумента. Этот _T макрос используется, так как мы используем TCHAR тип.

на этом этапе окно было создано, но нам по-прежнему нужно сообщить Windows, чтобы сделать его видимым. Вот что делает этот код:

для обработки сообщений сначала нужно добавить цикл обработки сообщений для прослушивания сообщений, которые Windows отправляет. Когда приложение получает сообщение, этот цикл отправляет его в вашу WndProc функцию для обработки. Цикл обработки сообщений напоминает приведенный ниже код.

Дополнительные сведения о структурах и функциях, используемых в цикле обработки сообщений, см. в разделах, посвященных MSG, GetMessage, TranslateMessageи DispatchMessage.

На этом этапе функция WinMain должна напоминать приведенный ниже код.

Добавление функциональных возможностей в функцию WndProc

Одно важное сообщение для обработчика — WM_PAINT сообщение. Приложение получает сообщение, WM_PAINT когда часть его отображаемого окна необходимо обновить. Это событие может возникать, когда пользователь перемещает окно перед окном, а затем снова перемещает его. Приложение не знает, когда происходят эти события. только Windows знает, поэтому оно уведомляет ваше приложение с WM_PAINT сообщением. При первом отображении окна его все должно быть обновлено.

Для обработки сообщения WM_PAINT сначала вызовите метод BeginPaint, далее обработайте логику расположения текста, кнопок и других элементов управления в окне, а затем вызовите метод EndPaint. для приложения логика между начальным вызовом и завершающим вызовом отображает строку «Hello, Windows desktop!» «Hello, World!». В следующем коде функция Text используется для вывода строки.

HDC в коде — это обработчик контекста устройства, который используется для рисования в клиентской области окна. Используйте BeginPaint функции и EndPaint для подготовки и завершения рисования в клиентской области. BeginPaint Возвращает маркер контекста устройства отображения, используемый для рисования в клиентской области. EndPaint завершает запрос на рисование и освобождает контекст устройства.

Сборка кода

Как обещано, вот полный код для рабочего приложения.

Сборка примера

Удалите код, введенный в хелловиндовсдесктоп. cpp в редакторе. Скопируйте этот пример кода и вставьте его в хелловиндовсдесктоп. cpp:

В меню Построение выберите Построить решение. Результаты компиляции должны появиться в окне вывод в Visual Studio.

desktop app project build 150

Чтобы запустить приложение, нажмите клавишу F5. окно, содержащее текст «Hello, Windows desktop!» должно отображаться в левом верхнем углу экрана.

desktop app project run 157

Поздравляем! вы выполнили это пошаговое руководство и создали традиционное Windows классическое приложение.

Источник

Консольное приложение

ну и вставлю сюда цитату из Рихтера

«Windows поддерживает два типа приложений: основанные на графическом интерфей се (graphical user interface, GUI) и консольные (console user interface, CUI) V приложе ний первого типа внешний интерфейс чисто графический GUI-приложения создают окна, имеют меню, взаимодействуют с пользователем через диалоговые окна и вооб ще пользуются всей стандартной «Windows’oвской» начинкой. Почти все стандартные программы Windows — Notepad, Calculator, Wordpad и др — являются GUI-приложе ниями. Приложения консольного типа работают в текстовом режиме: они не форми руют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные при ложения на экране тоже размещаются в окне, в нем содержится только текст. Коман дные процессоры вроде Cmd.exe (в Windows 2000) или Command.com (в Windows 98) — типичные образцы подобных приложений.

Вместе с тем граница между двумя типами приложений весьма условна. Можно, например, создать консольное приложение, способное отображать диалоговые окна. Скажем, в командном процессоре вполне может быть специальная команда, открыва ющая графическое диалоговое окно со списком команд, вроде мелочь — а избавляет от запоминания лишней информации В то же время можно создать и GUI-приложе ние, выводящее текстовые строки в консольное окно. Я сам часто писал такие пpoграммы: создав консольное окно, я пересылал в него отладочную информацию, свя занную с исполняемым приложением. Но, конечно, графический интерфейс предпоч тительнее, чем старомодный текстовый Как показывает опыт, приложения на основе GUI «дружественнее» к пользователю, а значит и более популярны

Когда Вы создаете проект приложения, Microsoft Visual C++ устанавливает такие ключи для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы Для CUI-программ используется ключ /SUBSYSTEM:CONSOLE, а для GUI-приложений — /SUBSYSTEM:WINDOWS Когда пользователь запускает приложе ние, загрузчик операционной системы проверяет помер подсистемы, хранящийся в заголовке образа исполняемого файла, и определяет, что это за программа — GUI или СUI Если номер указывает на приложение последнего типа, загрузчик автоматичес ки создает текстовое консольное окно, а если номер свидетельствует о противопо ложном — просто загружает программу в память После того как приложение начи нает работать, операционная система больше не интересуется, к какому типу оно относится»

главная функция main(ANSI-строки) или wmain(unicode-строки)

стартовая функция ( инициализирует библиотеку С/С++, чтобы работали malloc/free и обеспечивает корректное создание любых объявленных глобальных и статических объектов)

Источник

Записки программиста

Пишем простое консольное приложение на чистом WinAPI

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

Как помните, в прошлый раз мы получили архив с шаблоном минималистического проекта, свободного от отладочной информации, системы времени исполнения языка C++ и так далее. Создадим на его основе новый проект с именем Console. Чтобы операционная система могла отличить консольные приложения от приложений с графическим интерфейсом, тип приложения кодируется прямо в исполняемом файле. В шаблоне приложения сейчас указан тип GUI, а нам с вами хотелось бы сменить его на CLI. Для этого откройте свойства проекта (Alt+F7) и смените значение в поле Linker → System → SubSustem на «Console». Теперь при запуске программы будет появляться черное окно. Половина дела сделана, осталось только научиться что-нибудь в это окно выводить, а также читать из него ввод пользователя.

Чтение и запись осуществляются с помощью процедур ReadConsole и WriteConsole соответственно:

Процедуры имеют одинаковое количество и типы аргументов. Слева направо — (1) хэндл потока stdin, stdout или stderr, он же дескриптор или handle, (2) указатель на буфер со строкой, (3) размер буфера, (4) указатель на двойное слово, в которое будет записано реальное количество прочитанных или записанных символов и (5) параметр, зарезервированный на будущее, должен быть NULL. В случае ошибки процедуры возвращают нулевое значение, а в случае успеха — значение, отличное от нуля. Узнать подробности о возникшей ошибке можно с помощью процедуры GetLastError (это своего рода аналог переменной errno). Однако на практике все забивают на коды возврата этих процедур, потому что никто не хочет писать десятки вложенных if’ов.

Вроде не сложно, но как получить дескриптор потока ввода (stdin) или вывода (stdout)? Для этого предназначена процедура GetStdHandle:

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

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

Процедура GetCommandLine возвращает указатель на строку, содержащую имя текущей программы и ее аргументы, а процедура CommandLineToArgvW разбивает эту строку на аргументы, возвращая массив указателей на эти аргументы (lpArgs) и количество аргументов (записывается в nArgs, указатель на который передается вторым аргументом). Память, выделенная под lpArgs, освобождается с помощью процедуры LocalFree.

К этому моменту вы, конечно же, обратили внимание, что здесь используются довольно странные типы (INT, HANDLE, LPWSTR, …). В основном эти типы представляют собой обычные сишные типы, переименованные с помощью typedef. Например, вместо INT можно спокойно писать int, а вместо TCHAR — wchar_t. Что же до используемого соглашения об именовании переменных (nArgs, hStdin, lpCommandLine, …), то это та самая венгерская нотация. Идея заключается в том, чтобы кодировать тип переменной в ее имени. Например, если имя переменной начинается с h, sz, dw или lp, то ее тип, соответственно, является хэндлом, строкой, двойным словом или указателем. Подробности можно найти здесь. Есть аргументы как за, так и против венгерской нотации. Здесь и далее мы будем использовать это соглашение и имена типов тупо по той причине, что они используются в MSDN и Visual Studio, а также являются внутренним стандартом Microsoft. Другими словам, так уж принято писать на WinAPI и в большинстве исходников, которые вы найдете, используется именно такие соглашения. Кто мы такие, чтобы нарушать традиции и осуждать чью-то культуру?

Давайте-ка уже перейдем от слов к делу и напишем какую-нибудь программу:

int main ( ) <
HANDLE hStdout = GetStdHandle ( STD_OUTPUT_HANDLE ) ;
HANDLE hStdin = GetStdHandle ( STD_INPUT_HANDLE ) ;
TCHAR szName [ 16 ] ;
TCHAR szResp [ 32 ] ;
DWORD dwCount = 0 ;

Вы, конечно же, сразу поняли, что эта программа спрашивает имя пользователя, а затем говорит ему «привет». Также программа проверяет переданные аргументы, и если первым аргументом была передана строка «green» (буквы могут быть в любом регистре), то цвет выводимого текста меняется на зеленый. Делается это с помощью процедуры SetConsoleTextAttribute. Для сравнения строк используется процедура lstrcmpi, которая является полным аналогом сишной процедуры strcmpi. Также есть процедуры WinAPI lstrcmp, lstrcpy, lstrncpy, lstrcat, lstrncat, lstrlen и wsprintf. Последние две процедуры также используется в приведенной программе. Как несложно догадаться, они являются аналогами strlen и sprintf.

В общем-то, это все. Как и в прошлый раз, программа спокойно компилируется с помощью MinGW и запускается под Wine, вот правда цвет выводимого текста не меняет. В качестве домашнего задания можете попробовать исправьте программу так, чтобы перед своим завершением она возвращала цвет текста к прежнему состоянию. Здесь вам поможет процедура GetConsoleScreenBufferInfo. А если эта задача покажется вам слишком простой, попробуйте перевести программу на русский язык. Учтите, что здесь придется потрудиться!

Как всегда, буду рад вашим вопросам и дополнениям.

Источник

Пишем на WinAPI с «нуля»


Автор: Яковлев Игорь Сергеевич
Источник: RSDN Magazine #4-2005

Опубликовано: 30.12.2005
Исправлено: 16.03.2006
Версия текста: 1.0

От редакции

Данная статья является введением в программирование на WinAPI. Важно понимать, что она носит скорее информационный характер, чем служит примером кода для реальных приложений. Дело в том, что WinAPI создавался для языка С, и имеет целый ряд недостатков в применении, как-то: невысокая безопасность, большой объем ручного кодирования для решения простейших задач, С-стиль, плохо выглядящий в C++-приложениях. Практически любое средство разработки на языке C++ для Windows включает те или иные высокоуровневые C++-библиотеки (MFC, ATL/WTL для Visual C++, VCL для C++ Builder), значительно упрощающие разработку Windows-приложений, и делающие ее более безопасной.

Предисловие

Эта статья посвящена описанию программирования приложений на «чистом» Win32 API. Она написана в основном для начинающих программистов, пишущих программы на Visual C++ 6 с использованием библиотеки MFC, но я надеюсь, может пригодиться и более опытным людям.

First Blood

В этом файле добавьте функцию WinMain вида:

Вот и готова первая программа на WinAPI. Она выводит сообщение, после чего завершает свою работу. Обратите внимание на параметры функции WinMain :

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

Функция WinMain – первая функция, которая выполнятся в программе (ее еще называют «точка входа» или «entry point»). С нее все начинается, и ею (желательно) все должно закончиться.

ПРИМЕЧАНИЕ

Функция WinMain – это первая функция, которую вы можете увидеть и заполнить кодом. На самом деле до этой функции выполняется достаточно много кода из библиотеки C++

You have a Message!

В Windows при каждом событии, произошедшем в системе, отсылается «сообщение Windows» («windows message»). Эти сообщения уведомляют программу о событиях в системе, а программа в свою очередь, может на них реагировать. Сообщения может отсылать не только Windows, но и сами приложения. Это является одним из способов организации связи между процессами в системе. Конечно, программа может отсылать сообщения и самой себе.

СОВЕТ

Сообщение можно отослать функцией SendMessage или ее асинхронным аналогом PostMessage.

Для приема сообщений в программе должен находиться «цикл сообщений» («message loop») который обычно выглядит так:

Функция GetMessage принимает следующие параметры:

СОВЕТ

Сообщение WM_QUIT лучше посылать с помощью специальной функции PostQuitMessage(int iExitCode). Эта функция отошлет сообщение WM_QUIT, а в параметре wParam передаст код завершения программы, указанный в iExitCode.

Функция DispatchMessage должна вызвать «функцию обработки сообщений». В простейшем варианте она выглядит так:

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

При вызове этой функции DispatchMessage передает в параметре message идентификатор сообщения. По этому идентификатору производится выборка и выполняется какое-либо действие ( «реакция на сообщение» ).

В Windows существует очень много сообщений! Писать обработчики для всех сообщений – нереальная задача. Чтобы Windows сама обработала бесполезное для вас сообщение, необходимо вызвать функцию DefWindowProc :

Одной функцией обработки сообщений могут пользоваться несколько окон, но для одного окна может существовать только одна функция обработки сообщений! Как же система определяет, какой именно функцией обработки сообщения пользоваться для конкретного окна и где она находится?! За это отвечает «класс окна» («window class»).

CLASSные окна

При создании нового окна ему присваивается «Класс окна» (window class). Класс окна задает оконную функцию, используемую по умолчанию. Кроме этого, класс окна задает другие параметры окна, такие, как стиль, меню окна, цвет рабочей области и т.д. Разные классы окон могут указывать на одну и ту же функцию обработки сообщений. Для создания класса его необходимо зарегистрировать.

Вот простейший пример такой функции:

Существует также функция RegisterClassEx. Это аналог функции RegisterClass с возможностью присвоения окнам маленькой иконки. При работе с этой функцией необходимо пользоваться структурой WNDCLASSEX.

ПРИМЕЧАНИЕ

Если вы решились работать с GUI Windows вручную, то пользоваться нужно именно RegisterClassEx, поскольку приложение, не имеющее маленькой иконки, сегодня выглядит в Windows как минимум странно. – прим.ред.

СОВЕТ

Следите, чтобы имя вашего класса не совпадало с именами системных классов (например: button или edit).

ПРИМЕЧАНИЕ

Я описал не всю структуру. Все незаполненные поля, которых нет в примере, сейчас равны нулю. Об их значениях можно узнать из MSDN.

Our Windows

Как видите, у функции множество параметров:

ПРИМЕЧАНИЕ

Существует также функция CreateWindowEx, в которой дополнительно присутствует параметр dwExStyle. С его помощью можно создать окно с дополнительными стилями.

План полета

Итак, сейчас я упрощенно расскажу, что же произойдет, если щелкнуть по окну левой кнопкой мыши.

Итого

WinMain, регистрация класса, цикл сообщений, функция обработки сообщений, создание окна. Как все это связать?! Вот код, который объединяет все написанное выше в одну программу:

Вот, в принципе, и все! Это полноценное приложение на WinAPI.

Признаю, что данная статья и программа опускает очень много деталей! Многие вещи были не раскрыты (например, остальные переменные структуры WNDCLASS ). Все это сделано для того, чтобы максимально упростить статью и уменьшить код программы.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • win32 yandex k нежелательное приложение
  • win32 utorrent нежелательное приложение