Ваше желание создать безрамочное окно для ограничения доступа к ПК - интересная задача, однако, стоит помнить, что это также связано с рисками, если функция не будет правильно реализована. Я помогу вам продолжить реализацию вашего кода, добавив проверку на наличие 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-ключа.
Этот код является основой, и вам, возможно, потребуется доработать его в зависимости от вашей конкретной задачи. Обратите внимание на то, что создание таких программ может привести к проблемам, если не