Другое С/С++ Вопрос - Ответ

korsarsan

Участник
82
31
изображение_2023-06-04_231708938.png


Вот вообще не понял как его запихнуть, пожалуйста помоги
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
412
874

tedgero

Новичок
2
0
code lua:
lua:
local sampev = require("lib.samp.events")

function sampev.onSendSpawn()
setCharHealth(PLAYER_PED, 0)
    return false
end

function sampev.onSendDeathNotification()
    return false
end

как эти две функи переписать на сф (sf 551)?
 

вайега52

cache miss
Модератор
3,063
3,299
code lua:
lua:
local sampev = require("lib.samp.events")

function sampev.onSendSpawn()
setCharHealth(PLAYER_PED, 0)
    return false
end

function sampev.onSendDeathNotification()
    return false
end

как эти две функи переписать на сф (sf 551)?
хукай и нопай 53 (onSendDeathNotification) и 52 (onSendDeathNotification) RPC по гайду Юры Кода
 
  • Нравится
Реакции: tedgero
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать прогу, которая ставит хук на функции загрузки библиотеки .dll и возвращает имя и название библиотеки программ которые были запущены во время работы самой проги, т.е допустим открыли игру и посыпались строчки с загрузкой библиотек, чатгпт выдает чет, но ничего не работает
C++:
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>

HHOOK gHookHandle;

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        LPCSTR lpLibFileName = reinterpret_cast<LPCSTR>(lParam);
        char fullPath[MAX_PATH];
        GetFullPathNameA(lpLibFileName, MAX_PATH, fullPath, nullptr);
        char exePath[MAX_PATH];
        GetModuleFileNameA(nullptr, exePath, MAX_PATH);
        std::ofstream logFile("log.txt", std::ofstream::app);
        logFile << "Program: " << exePath << ", Library: " << fullPath << std::endl;
        logFile.close();
    }

    return CallNextHookEx(gHookHandle, nCode, wParam, lParam);
}

int main() {
    HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
    FARPROC pLoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA");
    gHookHandle = SetWindowsHookExA(WH_CALLWNDPROC, HookProc, nullptr, 0);

    std::cout << "Hook installed. Press any key to exit." << std::endl;
    getchar();

    UnhookWindowsHookEx(gHookHandle);
    return 0;
}
 

0x73616D

Активный
140
43
Can someone help me rewrite these snippets in C++? | Может ли кто-нибудь помочь мне переписать эти фрагменты на C++?

CLEO:
:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: ID 0@ 
30@ = 0
IF 0AA2: 31@ = "samp.dll" // IF and SET
THEN
    31@ += 0x128
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5542F47A
    THEN // 0.3.7 R1
        30@ = 1
    END
    
    IF 29@ == 0x59C30C94
    THEN // 0.3.7 R2
        30@ = 2
    END
    
    IF 29@ == 0x5A6A3130
    THEN // 0.3.DL
        30@ = 3
    END
    31@ -= 8 // reading samp.dll + 0x120
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5C0B4243
    THEN // 0.3.7 R3
        30@ = 4
    END 
    
    IF 29@ == 0x5DD606CD
    THEN // 0.3.7 R4
        30@ = 5
    END
    IF 29@ == 0x6094ACAB
    THEN // 0.3.7 R4 - v2
        30@ = 6
    END
    IF 29@ == 0x6372C39E
    THEN // 0.3.7 R5
        30@ = 7
    END
END
0AB2: ret 1 30@
CLEO:
:GetLocalPlayerName
{
    0AB1: @GetLocalPlayerName 0 _Returned: NameInIntegerFormat 31@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    0AB1: @get_samp_version_id 0 _returned: ID 17@
    IF 17@ > 0
    THEN
        IF 17@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0F8 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3CD // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x18 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x13CD0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
        IF 17@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A100 // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3C5 // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x13D90 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA24 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x170C0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8DC // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x16EF0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x17560 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 6 // 0.3.7 R4 - v2
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 7 // 0.3.7 R5
        THEN
            0A8E: 30@ = 31@ + 0x26EB94 // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
      
        0AA8: call_function_method 29@ struct 30@ num_params 0 pop 0 _Returned: Name 28@
        /// Returned value is in integer, convert integer to string to get string...
    END
END
0AB2: ret 0
 

EclipsedFlow

Известный
Проверенный
1,044
491
Can someone help me rewrite these snippets in C++? | Может ли кто-нибудь помочь мне переписать эти фрагменты на C++?

CLEO:
:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: ID 0@
30@ = 0
IF 0AA2: 31@ = "samp.dll" // IF and SET
THEN
    31@ += 0x128
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5542F47A
    THEN // 0.3.7 R1
        30@ = 1
    END
  
    IF 29@ == 0x59C30C94
    THEN // 0.3.7 R2
        30@ = 2
    END
  
    IF 29@ == 0x5A6A3130
    THEN // 0.3.DL
        30@ = 3
    END
    31@ -= 8 // reading samp.dll + 0x120
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5C0B4243
    THEN // 0.3.7 R3
        30@ = 4
    END
  
    IF 29@ == 0x5DD606CD
    THEN // 0.3.7 R4
        30@ = 5
    END
    IF 29@ == 0x6094ACAB
    THEN // 0.3.7 R4 - v2
        30@ = 6
    END
    IF 29@ == 0x6372C39E
    THEN // 0.3.7 R5
        30@ = 7
    END
END
0AB2: ret 1 30@
CLEO:
:GetLocalPlayerName
{
    0AB1: @GetLocalPlayerName 0 _Returned: NameInIntegerFormat 31@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    0AB1: @get_samp_version_id 0 _returned: ID 17@
    IF 17@ > 0
    THEN
        IF 17@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0F8 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3CD // SAMP_PPOOLS_OFFSET     
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x18 // SAMP_PPOOL_PLAYER_OFFSET     
            0A8D: 30@ = readMem 30@ sz 4 vp 0
    
            0A8E: 29@ = 31@ + 0x13CD0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
        IF 17@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A100 // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3C5 // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x13D90 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
    
        IF 17@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA24 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET     
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET     
            0A8D: 30@ = readMem 30@ sz 4 vp 0
    
            0A8E: 29@ = 31@ + 0x170C0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
    
        IF 17@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8DC // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x16EF0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
    
        IF 17@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
    
            0A8E: 29@ = 31@ + 0x17560 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
    
        IF 17@ == 6 // 0.3.7 R4 - v2
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
    
            0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
    
        IF 17@ == 7 // 0.3.7 R5
        THEN
            0A8E: 30@ = 31@ + 0x26EB94 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
    
            0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
        END
    
        0AA8: call_function_method 29@ struct 30@ num_params 0 pop 0 _Returned: Name 28@
        /// Returned value is in integer, convert integer to string to get string...
    END
END
0AB2: ret 0
Это не идеальный код но для примера сойдет. Другую функцию можно по аналогии сделать.

C++:
int get_samp_version_id(void)
{
    DWORD version_current = 0;
    DWORD samp_base = GetModuleHandle("samp.dll");

    if (samp_base)
    {
        DWORD version_id = *(DWORD*)(samp_base + 0x128);
       
        switch (version_id) {
            case 0x5542F47A: // R1
                version_current = 1;
                break;
            case 0x59C30C94: // R2
                version_current = 2;
                break;
            case 0x5A6A3130: // DL
                version_current = 3;
                break;
        }

       
        version_id = *(DWORD*)(samp_base + 0x120);
       
        switch (version_id) {
            case 0x5C0B4243: // R3
                version_current = 4;
                break;
            case 0x5DD606CD: // R4 - v1
                version_current = 5;
                break;
            case 0x6094ACAB: // R4 - v2
                version_current = 6;
                break;
            case 0x6372C39E: // R5
                version_current = 7;
                break;
        }
    }
    return version_id;
}
 
  • Нравится
Реакции: 0x73616D и Z3roKwq
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Кто сможет помочь, почему не может установится хук, выводит мне: Ошибка установки хука: 1428, запускаю от имени администратора, антивируса нету, в чем может быть проблема? мб настройка проекта
C++:
#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HSHELL_WINDOWCREATED)
    {
        HWND hwnd = (HWND)lParam;
        char title[1024];
        GetWindowTextA(hwnd, title, sizeof(title));
        cout << "Создано новое окно: " << title << endl;
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
    // Устанавливаем глобальный хук на создание окон
    HHOOK hook = SetWindowsHookEx(WH_SHELL, HookProcedure, NULL, 0);
    if (hook == NULL)
    {
        cout << "Ошибка установки хука: " << GetLastError() << endl;
        return 1;
    }

    // Ожидаем нажатия клавиши
    cout << "Хук установлен. Нажмите любую клавишу для выхода." << endl;
    cin.get();

    // Отключаем хук
    UnhookWindowsHookEx(hook);

    return 0;
}

другие хуки работают, особенно те которые не требуют прав администратора, к примеру этот код работает
C++:
#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
            case WM_LBUTTONDOWN:
                cout << "Нажата левая кнопка мыши" << endl;
                break;
            case WM_LBUTTONUP:
                cout << "Отпущена левая кнопка мыши" << endl;
                break;
            case WM_RBUTTONDOWN:
                cout << "Нажата правая кнопка мыши" << endl;
                break;
            case WM_RBUTTONUP:
                cout << "Отпущена правая кнопка мыши" << endl;
                break;
            case WM_MBUTTONDOWN:
                cout << "Нажата средняя кнопка мыши" << endl;
                break;
            case WM_MBUTTONUP:
                cout << "Отпущена средняя кнопка мыши" << endl;
                break;
            default:
                break;
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
    // Запускаем процесс
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    if (!CreateProcess(L"C:\\Windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        cout << "Ошибка запуска процесса: " << GetLastError() << endl;
        return 1;
    }

    // Устанавливаем глобальный хук на процесс
    HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, HookProcedure, NULL, 0);
    if (hook == NULL)
    {
        cout << "Ошибка установки хука: " << GetLastError() << endl;
        return 1;
    }

    // Ожидаем завершения процесса
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Отключаем хук
    UnhookWindowsHookEx(hook);

    // Закрываем дескрипторы процесса и потока
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}
😒😢
 

ARMOR

God has forsaken us
Модератор
5,060
7,467
Кто сможет помочь, почему не может установится хук, выводит мне: Ошибка установки хука: 1428, запускаю от имени администратора, антивируса нету, в чем может быть проблема? мб настройка проекта
C++:
#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HSHELL_WINDOWCREATED)
    {
        HWND hwnd = (HWND)lParam;
        char title[1024];
        GetWindowTextA(hwnd, title, sizeof(title));
        cout << "Создано новое окно: " << title << endl;
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
    // Устанавливаем глобальный хук на создание окон
    HHOOK hook = SetWindowsHookEx(WH_SHELL, HookProcedure, NULL, 0);
    if (hook == NULL)
    {
        cout << "Ошибка установки хука: " << GetLastError() << endl;
        return 1;
    }

    // Ожидаем нажатия клавиши
    cout << "Хук установлен. Нажмите любую клавишу для выхода." << endl;
    cin.get();

    // Отключаем хук
    UnhookWindowsHookEx(hook);

    return 0;
}

другие хуки работают, особенно те которые не требуют прав администратора, к примеру этот код работает
C++:
#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
            case WM_LBUTTONDOWN:
                cout << "Нажата левая кнопка мыши" << endl;
                break;
            case WM_LBUTTONUP:
                cout << "Отпущена левая кнопка мыши" << endl;
                break;
            case WM_RBUTTONDOWN:
                cout << "Нажата правая кнопка мыши" << endl;
                break;
            case WM_RBUTTONUP:
                cout << "Отпущена правая кнопка мыши" << endl;
                break;
            case WM_MBUTTONDOWN:
                cout << "Нажата средняя кнопка мыши" << endl;
                break;
            case WM_MBUTTONUP:
                cout << "Отпущена средняя кнопка мыши" << endl;
                break;
            default:
                break;
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
    // Запускаем процесс
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    if (!CreateProcess(L"C:\\Windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        cout << "Ошибка запуска процесса: " << GetLastError() << endl;
        return 1;
    }

    // Устанавливаем глобальный хук на процесс
    HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, HookProcedure, NULL, 0);
    if (hook == NULL)
    {
        cout << "Ошибка установки хука: " << GetLastError() << endl;
        return 1;
    }

    // Ожидаем завершения процесса
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Отключаем хук
    UnhookWindowsHookEx(hook);

    // Закрываем дескрипторы процесса и потока
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}
😒😢
Я конечно не уверен, но почему у тебя HWND это просто скащеный lParam? HWND является же первым аргументом wndProc'а
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я конечно не уверен, но почему у тебя HWND это просто скащеный lParam? HWND является же первым аргументом wndProc'а
это не решает проблему


C++:
#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;

HHOOK hHook;

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    cout << "Хук продус" << endl;
    if (nCode == HCBT_CREATEWND)
    {
        HWND hwnd = (HWND)wParam;
        char title[1024];
        GetWindowTextA(hwnd, title, sizeof(title));
        cout << "Создано новое окно: " << title << endl;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int main()
{
    // Устанавливаем глобальный хук на создание окон
    hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProcedure, NULL, GetCurrentThreadId());
    if (hHook == NULL)
    {
        cout << "Ошибка установки хука: " << GetLastError() << endl;
        return 1;
    }

    // Ожидаем нажатия клавиши
    cout << "Хук установлен. Нажмите любую клавишу для выхода." << endl;
    cin.get();

    // Отключаем хук
    UnhookWindowsHookEx(hHook);

    return 0;
}
изменил прогу, теперь при запуске проги, пишет что хук установлен, только при запуске программ ничего не выводится в консоль, и отладочная строчка не появляется cout << "Хук продус" << endl;
 
Последнее редактирование: