Подмена изображения на экране - C (СИ)
Формулировка задачи:
Как написать программу, которая в реальном времени перехватывает изображение на экране и каким-то образом его модифицирует (переворачивает, отражает слева направо, инвертирует цвета и т.д.)? Очень важно, чтобы программа была написана на чистом C (можно с ASM) и работала как можно эффективнее.
Решение задачи: «Подмена изображения на экране»
textual
Листинг программы
#include <windows.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <tchar.h> int GetControlKey() { DWORD mode; HANDLE hstdin; INPUT_RECORD inrec; DWORD count; TCHAR default_prompt[] = _T(""); hstdin = GetStdHandle(STD_INPUT_HANDLE); if (hstdin == INVALID_HANDLE_VALUE || !GetConsoleMode( hstdin, &mode ) || !SetConsoleMode( hstdin, 0)) { return 0; } WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), default_prompt, lstrlen(default_prompt), &count, NULL ); FlushConsoleInputBuffer(hstdin); do { ReadConsoleInput(hstdin, &inrec, 1, &count); } while ((inrec.EventType != KEY_EVENT) || inrec.Event.KeyEvent.bKeyDown); SetConsoleMode(hstdin, mode); return inrec.Event.KeyEvent.wVirtualKeyCode; } void SetDmPels(DEVMODE * dm) { DWORD dwTemp = dm->dmPelsHeight; dm->dmPelsHeight= dm->dmPelsWidth; dm->dmPelsWidth = dwTemp; } int main() { DEVMODE dm; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) { printf("Change the orientation of the monitor screen.\nControl: up, left, down, right."); BOOL state = TRUE; long lRet; DWORD dwTemp = dm.dmPelsHeight; dm.dmPelsHeight= dm.dmPelsWidth; dm.dmPelsWidth = dwTemp; while (state) { SetDmPels(&dm); switch (GetControlKey()) { case VK_UP: dm.dmDisplayOrientation = DMDO_DEFAULT; break; case VK_LEFT: dm.dmDisplayOrientation = DMDO_90; break; case VK_DOWN: dm.dmDisplayOrientation = DMDO_180; break; case VK_RIGHT: dm.dmDisplayOrientation = DMDO_270; break; default: state = FALSE; break; } lRet = ChangeDisplaySettings(&dm, 0); } } return 0; }
Объяснение кода листинга программы
- #include
Указывает директиву для включения в программу библиотеки Windows, которая содержит функции для работы с Windows API. - #include
Указывает директиву для включения в программу библиотеки stdio.h, которая содержит функции для работы с консолью. - #include
Указывает директиву для включения в программу библиотеки conio.h, которая содержит функции для работы с консолью, такие как getch(). - #include
Указывает директиву для включения в программу библиотеки string.h, которая содержит функции для работы со строками. - #include
Указывает директиву для включения в программу библиотеки tchar.h, которая содержит функции для работы с текстом в UNICODE-среде. - int GetControlKey() Функция, которая получает код клавиши из консоли.
- *void SetDmPels(DEVMODE dm)** Функция, которая меняет разрешение экрана в текущем режиме дисплея.
- int main() Точка входа в программу.
- DEVMODE dm; Структура, содержащая информацию о текущих настройках дисплея.
- ZeroMemory(&dm, sizeof(dm)); Очищает структуру dm.
- dm.dmSize = sizeof(dm); Устанавливает размер структуры dm.
- if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) Получает текущие настройки дисплея.
- printf(
Change the orientation of the monitor screen.\nControl: up, left, down, right.
); Выводит сообщение об изменении ориентации экрана и управляющих клавишах. - BOOL state = TRUE; Переменная для хранения состояния программы.
- long lRet; Переменная для хранения возвращаемого значения функции ChangeDisplaySettings.
- DWORD dwTemp = dm.dmPelsHeight; Переменная для временного хранения значения высоты пикселей.
- dm.dmPelsHeight= dm.dmPelsWidth; Меняет высоту и ширину пикселей местами.
- dm.dmPelsWidth = dwTemp; Восстанавливает исходное значение ширины пикселей.
- while (state) { Входит в цикл, пока состояние программы TRUE.
- SetDmPels(&dm); Применяет новые настройки разрешения экрана.
- switch (GetControlKey()) { Выполняет действия в зависимости от нажатой клавиши.
- case VK_UP: Устанавливает ориентацию экрана по умолчанию.
- case VK_LEFT: Устанавливает ориентацию экрана 90 градусов.
- case VK_DOWN: Устанавливает ориентацию экрана 180 градусов.
- case VK_RIGHT: Устанавливает ориентацию экрана 270 градусов.
- default: Выходит из цикла, если нажата неправильная клавиша.
- lRet = ChangeDisplaySettings(&dm, 0); Применяет новые настройки разрешения экрана.
- } Конец цикла.
- return 0; Завершает программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д