Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Создание меню.

  • Автор темы Автор темы Zzzetych
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2017
Сообщения
80
Реакции
15
Вообщем ай хэв трабл. Есть окно игры, поверх него я создаю ещё одно (чтобы взаимодействовать в дальнейшем в нём), но как сделать обработку кнопок? При нажатии на кнопку (к примеру INSERT) оно должно удаляться (или скрываться), но в каком потоке идёт обработка кнопок?

В этом потоке, к примеру, срабатывает кнопка если прям выделить окно (нажав по нему), но тогда игру сворачивает и это окно появляется на рабочем столе.

C++:
Expand Collapse Copy
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
        case VK_INSERT:
            {
                wndStatus = !wndStatus;
                addMessageToChat(gray_color, "message");
                init_render(hInstance, nullptr, nullptr, 0);
                break;
            }
        }
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Доп. окно создаю по средствам WinAPI.

У меня есть теория, а именно: Нужно обойти сворачивание приложения при SetActiveWindow(идентификатор окна); Ну и работать с кнопками в потоке WndProc. У кого есть мысли по этому поводу? ( игра не CS:GO, а GTA SA:MP, но особой сути не меняет) )
 
Если кому нужно знать что такое init_render и как создаётся окно / какие параметры оно имеет:


C++:
Expand Collapse Copy
int init_render(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    if (hWnd)
        DestroyWindow(hWnd);
        //ShowWindow(hWnd, !wndStatus ? SW_HIDE : SW_SHOW);

    if (!hWnd)
    {
        LPCTSTR lpzClass = TEXT("myWindowClass");
       
        if (!RegMyWindowClass(hInstance, lpzClass))
            return 1;
       
        RECT screen_rect;
        GetWindowRect(GetDesktopWindow(), &screen_rect);
       
        int x = screen_rect.right / 2 - 150;
        int y = screen_rect.bottom / 2 - 75;

        //Само окно
        hWnd = CreateWindow(lpzClass, TEXT(" "), WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 300, 150, NULL, NULL, hInstance, NULL);

        SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

        LONG lStyle = GetWindowLong(hWnd, GWL_STYLE);

        lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_EX_WINDOWEDGE | WS_EX_TOPMOST);
       
        SetWindowLong(hWnd, GWL_STYLE, lStyle);
       
        //SetActiveWindow(m_pGameWindow);
       
        if (!hWnd) return 2;

        MSG msg = { 0 };
        int iGetOk = 0;
       
        while ((iGetOk = GetMessage(&msg, NULL, 0, 0)) != 0)
        {
            if (iGetOk == -1) return 3;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    return 0;
}
 
Вообщем ай хэв трабл. Есть окно игры, поверх него я создаю ещё одно (чтобы взаимодействовать в дальнейшем в нём), но как сделать обработку кнопок? При нажатии на кнопку (к примеру INSERT) оно должно удаляться (или скрываться), но в каком потоке идёт обработка кнопок?

В этом потоке, к примеру, срабатывает кнопка если прям выделить окно (нажав по нему), но тогда игру сворачивает и это окно появляется на рабочем столе.

C++:
Expand Collapse Copy
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
        case VK_INSERT:
            {
                wndStatus = !wndStatus;
                addMessageToChat(gray_color, "message");
                init_render(hInstance, nullptr, nullptr, 0);
                break;
            }
        }
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Доп. окно создаю по средствам WinAPI.

У меня есть теория, а именно: Нужно обойти сворачивание приложения при SetActiveWindow(идентификатор окна); Ну и работать с кнопками в потоке WndProc. У кого есть мысли по этому поводу? ( игра не CS:GO, а GTA SA:MP, но особой сути не меняет) )
Зачем создавать отдельный поток обработки клавиш? GetAsyncKeyState() для кого?
 
Зачем создавать отдельный поток обработки клавиш? GetAsyncKeyState() для кого?
Ты не понял. Когда я инжекчу свою длл библиотеку в процесс, то создаётся поток mainThread, после чего все манипуляции происходят там (тот же самый GetASyncKeyState(key)), но как только я создаю окно, этот поток перестаёт работать (или функция потока)
C++:
Expand Collapse Copy
void main_thread(HINSTANCE dll)
{
    while(true)
    {
        if (GetAsyncKeyState(VK_INSERT))
        {
            wndStatus = !wndStatus;
            init_render(dll, nullptr, nullptr, 0);
        }
    }
}

HANDLE mainThread

//apientry dllmain (inside)
mainThread = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)main_thread, hModule, 0, nullptr);
 
Назад
Сверху Снизу