ASI || При вызове ImGui_ImplWin32_WndProcHandler появляется курсор

ANZR

Известный
Автор темы
168
104
При вызове ImGui_ImplWin32_WndProcHandler появляется курсор, который нельзя никак убрать .-.
Я пробовал ImGui::GetIO().MouseDrawCursor = false; и все равно курсор остается на месте
 
Решение
Значит ты чет не так делаешь. Обработчик просто так курсор не скрывает и не показывает. Проблема в твоем коде, который мы не видим и не можем указать где ошибка.
Вот отрывок кода. Мышка появляется только когда я подключаю к WndProc обработчик ImGui
KeyHook.cpp:
LRESULT APIENTRY CKeyHook::hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_SYSKEYDOWN:
    case WM_SYSKEYUP:
    case WM_KEYDOWN:
    case WM_KEYUP:
    {
        bool bDown = (msg == WM_SYSKEYDOWN || msg == WM_KEYDOWN);
        int    iKey = (int)wParam;
        uint32_t ScanCode = LOBYTE(HIWORD(lParam));

        pKeyHook->bKeyTable[iKey] = bDown;

        break;
    }
    }

    if (pMenu->bOpen)...

RedHolms

Известный
Проверенный
617
360
Это только ПРИМЕР, его ты интегрируешь в свой код
C++:
// куда-нибудь
static bool isCursorActiveValue = true;

static void showCursor_impl(bool v) {
   samp::RefGame()->SetCursorMode(v ? samp::CURSOR_LOCKCAM : samp::CURSOR_NONE, !v);
   if (!v)
      samp::RefGame()->ProcessInputEnabling();
}

void showCursor(bool show) {
   if (show) {
      showCursor_impl(true);
        ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouseCursorChange;
    } else if (isCursorActiveValue) {
      showCursor_impl(false);
        ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
        ImGui::SetMouseCursor(ImGuiMouseCursor_None);
    }
   isCursorActiveValue = show;
}

// в хуке Present
if (ImguiActive()) {    
    ImGui_ImplDX9_NewFrame();
    ImGui_ImplWin32_NewFrame();
    ImGui::NewFrame();
    ImguiDraw();
    ImGui::EndFrame();
    ImGui::Render();
    ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}

showCursor(ImguiMouseActive());
 

ANZR

Известный
Автор темы
168
104
Значит ты чет не так делаешь. Обработчик просто так курсор не скрывает и не показывает. Проблема в твоем коде, который мы не видим и не можем указать где ошибка.
Вот отрывок кода. Мышка появляется только когда я подключаю к WndProc обработчик ImGui
KeyHook.cpp:
LRESULT APIENTRY CKeyHook::hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_SYSKEYDOWN:
    case WM_SYSKEYUP:
    case WM_KEYDOWN:
    case WM_KEYUP:
    {
        bool bDown = (msg == WM_SYSKEYDOWN || msg == WM_KEYDOWN);
        int    iKey = (int)wParam;
        uint32_t ScanCode = LOBYTE(HIWORD(lParam));

        pKeyHook->bKeyTable[iKey] = bDown;

        break;
    }
    }

    if (pMenu->bOpen)
        ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam);

    if (isKeyPressed(VK_INSERT))
    {
        pMenu->bOpen = !pMenu->bOpen;
        pMenu->iToggle = 0;
    }
    return pKeyHook->oWndProc(hWnd, msg, wParam, lParam);
}

KeyHook.h:
class CKeyHook
{
public:
    CKeyHook()
    {
        memset(bKeyTable, false, sizeof(bKeyTable));
        oWndProc = (tWndProc)(pSAMP->g_dwSAMP_Addr + 0x5DB40);
        oCPad_UpdateGameKey = (tCPad_UpdateGameKey)0x541C40;
        DetourRestoreAfterWith();
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        pSecure->SDetourAttach(&(PVOID&)oWndProc, hkWndProc);
        DetourTransactionCommit();
        pSecure->HookInstallCall((DWORD)0x541E17, (DWORD)hkCPad_UpdateGameKey);
    }

    ~CKeyHook()
    {
        memset(bKeyTable, false, sizeof(bKeyTable));
        DetourRestoreAfterWith();
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)oWndProc, hkWndProc);
        DetourTransactionCommit();
        Memory::memcpy_safe((void*)0x541E17, "\xE8\x24\xFE\xFF\xFF", 5);
    }

    bool bKeyTable[256];

    struct stGameKeyState
    {
        int iState{ 0 };
        bool bActive{ false };
    } g_GameKeyState[32];

private:

    typedef LRESULT(__stdcall* tWndProc)(HWND, UINT, WPARAM, LPARAM);
    typedef BYTE(__thiscall* tCPad_UpdateGameKey)(CPad*, int);

    static LRESULT __stdcall hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    static BYTE __stdcall hkCPad_UpdateGameKey(int iKey);

    tWndProc oWndProc;
    tCPad_UpdateGameKey oCPad_UpdateGameKey;
};

extern CKeyHook * pKeyHook;


Это только ПРИМЕР, его ты интегрируешь в свой код
C++:
// куда-нибудь
static bool isCursorActiveValue = true;

static void showCursor_impl(bool v) {
   samp::RefGame()->SetCursorMode(v ? samp::CURSOR_LOCKCAM : samp::CURSOR_NONE, !v);
   if (!v)
      samp::RefGame()->ProcessInputEnabling();
}

void showCursor(bool show) {
   if (show) {
      showCursor_impl(true);
        ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouseCursorChange;
    } else if (isCursorActiveValue) {
      showCursor_impl(false);
        ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
        ImGui::SetMouseCursor(ImGuiMouseCursor_None);
    }
   isCursorActiveValue = show;
}

// в хуке Present
if (ImguiActive()) {   
    ImGui_ImplDX9_NewFrame();
    ImGui_ImplWin32_NewFrame();
    ImGui::NewFrame();
    ImguiDraw();
    ImGui::EndFrame();
    ImGui::Render();
    ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}

showCursor(ImguiMouseActive());
ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange; Помогло решить эту проблему
Сябик)

Крч, как я пофиксил
Я в конструктор класса CMenu вставил вот эту строчку
C++:
ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
После чего все стало нормальным
Выглядит оно вот так
C++:
class CMenu
{
public:
    CMenu(IDirect3DDevice9* pDevice)
    {
        iToggle = 3;
        ImGui::CreateContext();
        ImGui::GetIO().IniFilename = NULL;
        ImGui_ImplWin32_Init(GetActiveWindow());
        ImGui_ImplDX9_Init(pDevice);
        ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
        pFont = ImGui::GetIO().Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\verdanab.ttf", 13.1f);
        Theme();
    };

    ~CMenu()
    {
        ImGui_ImplDX9_Shutdown();
        ImGui_ImplWin32_Shutdown();
        ImGui::DestroyContext();
    };

    void Update();
    void Render();
    void Theme();

    int iToggle, iCurrentTab, iCurrentCategory;
    bool bOpen = false;

    ImFont* pFont, * pIcons;
};
 
Последнее редактирование: