Untitled

 avatar
unknown
c_cpp
7 months ago
2.6 kB
20
Indexable
#include <windows.h>
#include <mmsystem.h>  // Для mciSendString
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "winmm.lib")

// Поток для проигрывания MP3
DWORD WINAPI PlaySoundThread(LPVOID param) {
    const wchar_t* filename = (const wchar_t*)param;

    // Получаем путь к исполняемому файлу и подставляем имя MP3
    wchar_t path[MAX_PATH];
    GetModuleFileNameW(NULL, path, MAX_PATH);
    wchar_t* slash = wcsrchr(path, L'\\');
    if (slash) *(slash + 1) = L'\0'; // Обрезаем до папки
    wcscat_s(path, MAX_PATH, filename);

    // Команда MCI: открыть файл
    wchar_t cmd[256];
    swprintf_s(cmd, 256, L"open \"%s\" type mpegvideo alias mysound", path);
    mciSendStringW(cmd, NULL, 0, NULL);

    // Проиграть файл (асинхронно) и дождаться окончания
    mciSendStringW(L"play mysound wait", NULL, 0, NULL);

    // Закрыть дескриптор в MCI
    mciSendStringW(L"close mysound", NULL, 0, NULL);
    return 0;
}

// Хук-процедура (низкоуровневая клавиатура)
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION && wParam == WM_KEYDOWN) {
        KBDLLHOOKSTRUCT *kbd = (KBDLLHOOKSTRUCT*)lParam;
        if (kbd->vkCode == 'Q') {
            // Запустить поток для проигрывания q.mp3
            CreateThread(NULL, 0, PlaySoundThread, (LPVOID)L"q.mp3", 0, NULL);
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int) {
    // Скрыть консольное окно (если есть)
    HWND hwndConsole = GetConsoleWindow();
    if (hwndConsole) ShowWindow(hwndConsole, SW_HIDE);

    // Устанавливаем глобальный хук клавиатуры
    HHOOK hook = SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc,
                                  GetModuleHandle(NULL), 0);
    if (!hook) {
        MessageBoxW(NULL, L"Не удалось установить хук.", L"Ошибка", MB_OK);
        return 1;
    }

    // Цикл обработки сообщений (нужен, чтобы хук работал)
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        // Без окон мы всё равно должны вызвать DispatchMessage
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hook);
    return 0;
}
Editor is loading...
Leave a Comment