Кто может помочь с дополнением скрипта на C++?

Как ограничить доступ детей к ПК, при этом оставив его постоянно включенным и запущенными необходимыми программами? Я рассматриваю возможность создания прозрачного безрамочного окна Windows, которое займет весь экран. Необходимо убрать кнопки управления (закрыть, свернуть) и исключить возможность закрыть окно через панель управления, оставив возможность закрыть его только с помощью комбинации клавиш, например, Shift + 1, или через подключение USB-накопителя, на котором будет файл key.txt с командой "убрать окно". Я уже реализовал некоторый функционал, но у меня возникают проблемы с проверкой флешки и с ограничением доступа к закрытию окна через панель управления. Вот что у меня есть на данный момент:

```cpp
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string> // Заголовок для std::string

#define ID_TIMER 1

// Глобальные переменные
HINSTANCE hInst;
HWND hWnd;

// Прототипы функций
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void ShowWindowCentered(HWND hWnd, int width, int height);

// Вычисление размеров окна по всему экрану
void GetFullScreenRect(RECT& rect) {
    // Получаем размеры рабочего пространства без панели задач
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
}

int main() {
    // Регистрируем класс окна
    const wchar_t CLASS_NAME[] = L"MyWindowClass"; // Широкое название класса

    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Получаем размеры окна
    RECT screenRect;
    GetFullScreenRect(screenRect);

    // Создаем окно
    hWnd = CreateWindowEx(
        WS_EX_TOPMOST | WS_EX_TOOLWINDOW, // 
```
  • 4 февраля 2025 г. 15:14
Ответы на вопрос 5
Ваше желание создать безрамочное окно для ограничения доступа к ПК - интересная задача, однако, стоит помнить, что это также связано с рисками, если функция не будет правильно реализована. Я помогу вам продолжить реализацию вашего кода, добавив проверку на наличие USB-накопителя с вашим ключевым файлом и возможность закрытия окна через комбинацию клавиш, а также решение для защиты от закрытия окна через панель управления.

### 1. Добавление обработки USB накопителя
Вы можете использовать `GetLogicalDrives()` для получения списка логических дисков и проверять наличие вашего USB накопителя.

### 2. Реализация комбинации клавиш для закрытия окна
Ваша комбинация клавиш может быть обработана в цикле обработки сообщений окна.

### 3. Изменение класса окна для запрета закрытия
Для предотвращения закрытия окна с помощью стандартных операций Windows вам нужно переопределить функцию обработки сообщений.

Приведенный ниже код - это пример, как можно это реализовать:

```cpp
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>

#define ID_TIMER 1
#define USB_KEY_FILENAME "key.txt"

// Глобальные переменные
HINSTANCE hInst;
HWND hWnd;

// Прототипы функций
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void GetFullScreenRect(RECT& rect);
bool CheckUSBKeyExists();

int main() {
    const wchar_t CLASS_NAME[] = L"MyWindowClass";

    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    RECT screenRect;
    GetFullScreenRect(screenRect);

    hWnd = CreateWindowEx(
        WS_EX_TOPMOST | WS_EX_TOOLWINDOW, 
        CLASS_NAME,
        L"Child Lock",
        WS_POPUP,
        screenRect.left, screenRect.top,
        screenRect.right - screenRect.left,
        screenRect.bottom - screenRect.top,
        NULL,
        NULL,
        GetModuleHandle(NULL),
        NULL
    );

    ShowWindow(hWnd, SW_SHOW);

    // Цикл сообщений
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        // Проверка на ввод комбинации клавиш для закрытия окна
        if ((GetAsyncKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(0x31) & 0x8000)) ) {
            DestroyWindow(hWnd);
        }
        // Проверка наличия USB ключа
        if (CheckUSBKeyExists()) {
            DestroyWindow(hWnd);
        }
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_CLOSE:
        // Игнорируем попытки закрытия окна
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

void GetFullScreenRect(RECT& rect) {
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
}

bool CheckUSBKeyExists() {
    // Здесь вы можете реализовать логику для проверки наличия вашего USB ключа
    // Например, проверять наличие файла `key.txt` на USB-диске
    char driveLetter = 'E'; // Замените на букву вашего USB-диска
    std::string filePath = std::string(1, driveLetter) + ":\\";
    filePath += USB_KEY_FILENAME;

    std::ifstream file(filePath);
    return file.good(); // Возвращает true, если файл существует
}
```

### Объяснение кода:
- **WindowProc**: Переопределяет стандартную обработку сообщений. Окно игнорирует сообщения `WM_CLOSE`.
- **CheckUSBKeyExists**: Проверяет, существует ли файл на USB накопителе, предоставляя путь к `key.txt`. Можно настроить логику поиска накопителя (например, цикл по всем логическим дискам).
- **Цикл обработки сообщений**: Проверяет комбинацию клавиш `Shift + 1` для закрытия окна и наличие USB-ключа.

Этот код является основой, и вам, возможно, потребуется доработать его в зависимости от вашей конкретной задачи. Обратите внимание на то, что создание таких программ может привести к проблемам, если не
win-l
Мудрость это сила ума 
Зачем этот велосипед? Если задача просто оградить комп от детей, достаточно задать пароль и сделать switch user. Всё пользовательские процессы продолжат работу, а, кто не знает пароль, подключиться не сможет...
Похожие вопросы