Подмена изображения на экране - 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;
}

Объяснение кода листинга программы

  1. #include Указывает директиву для включения в программу библиотеки Windows, которая содержит функции для работы с Windows API.
  2. #include Указывает директиву для включения в программу библиотеки stdio.h, которая содержит функции для работы с консолью.
  3. #include Указывает директиву для включения в программу библиотеки conio.h, которая содержит функции для работы с консолью, такие как getch().
  4. #include Указывает директиву для включения в программу библиотеки string.h, которая содержит функции для работы со строками.
  5. #include Указывает директиву для включения в программу библиотеки tchar.h, которая содержит функции для работы с текстом в UNICODE-среде.
  6. int GetControlKey() Функция, которая получает код клавиши из консоли.
  7. *void SetDmPels(DEVMODE dm)** Функция, которая меняет разрешение экрана в текущем режиме дисплея.
  8. int main() Точка входа в программу.
  9. DEVMODE dm; Структура, содержащая информацию о текущих настройках дисплея.
  10. ZeroMemory(&dm, sizeof(dm)); Очищает структуру dm.
  11. dm.dmSize = sizeof(dm); Устанавливает размер структуры dm.
  12. if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) Получает текущие настройки дисплея.
  13. printf(Change the orientation of the monitor screen.\nControl: up, left, down, right.); Выводит сообщение об изменении ориентации экрана и управляющих клавишах.
  14. BOOL state = TRUE; Переменная для хранения состояния программы.
  15. long lRet; Переменная для хранения возвращаемого значения функции ChangeDisplaySettings.
  16. DWORD dwTemp = dm.dmPelsHeight; Переменная для временного хранения значения высоты пикселей.
  17. dm.dmPelsHeight= dm.dmPelsWidth; Меняет высоту и ширину пикселей местами.
  18. dm.dmPelsWidth = dwTemp; Восстанавливает исходное значение ширины пикселей.
  19. while (state) { Входит в цикл, пока состояние программы TRUE.
  20. SetDmPels(&dm); Применяет новые настройки разрешения экрана.
  21. switch (GetControlKey()) { Выполняет действия в зависимости от нажатой клавиши.
  22. case VK_UP: Устанавливает ориентацию экрана по умолчанию.
  23. case VK_LEFT: Устанавливает ориентацию экрана 90 градусов.
  24. case VK_DOWN: Устанавливает ориентацию экрана 180 градусов.
  25. case VK_RIGHT: Устанавливает ориентацию экрана 270 градусов.
  26. default: Выходит из цикла, если нажата неправильная клавиша.
  27. lRet = ChangeDisplaySettings(&dm, 0); Применяет новые настройки разрешения экрана.
  28. } Конец цикла.
  29. return 0; Завершает программу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы