Добавить пользовательский курсор на текстуру ID3D11Texture2D - PullRequest
0 голосов
/ 20 апреля 2020

Я совершенно новичок в DirectX. Но я использую его в своем приложении захвата экрана. Я снимаю экран, используя API дублирования рабочего стола. Теперь я хочу обновить информацию о курсоре, вместо исходного курсора я хочу задать пользовательский курсор (пользовательский курсор может иметь любую форму). Пожалуйста, помогите мне, как это сделать?

У меня есть PTR_INFO (здесь указывается позиция указателя, DXGI_OUTDUPL_POINTER_SHAPE_INFO), ID3D11DeviceContext, ID3D11Device и ID3D11Texture2D , для которого я хочу выполнить эту операцию.

Заранее спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Я нашел решение для этого. Я пытаюсь объяснить это ниже:

Сначала получите DXGISurface, используя:

hr =ID3D11Texture2D->QueryInterface(IID_PPV_ARGS(&lIDXGISurface1)); // ID3D11Texture2D is the catured texture

Следующий шаг - создать объект для CURSORINFO для хранения информации. по поводу курсора:


lCursorInfo.cbSize = sizeof(lCursorInfo);

auto lBoolres = GetCursorInfo(&lCursorInfo);

if (lBoolres == TRUE)
{
    if (lCursorInfo.flags == CURSOR_SHOWING)
    {
        // currently lCursorInfo.hCursor has the shape of actual cursor that is coming to your system to modify it you can use the below line

        std::string path = "cursor.cur"; // this is path to the file where .cur file available in your system
        lCursorInfo.hCursor = LoadCursorFromFileA(path.c_str());
        // You can refer https://docs.microsoft.com/en-us/windows/win32/menurc/using-cursors for creating your own cursor

        auto lCursorPosition = lCursorInfo.ptScreenPos;
        auto lCursorSize = lCursorInfo.cbSize;
        HDC  lHDC;
        lIDXGISurface1->GetDC(FALSE, &lHDC); // getting handle to draw the cursor
        // Draw the cursor
        DrawIconEx(
            lHDC,
            lCursorPosition.x,
            lCursorPosition.y,
            lCursorInfo.hCursor,
            0,
            0,
            0,
            0,
            DI_NORMAL | DI_DEFAULTSIZE);
        // Release the handle
        lIDXGISurface1->ReleaseDC(nullptr);
    }
}
...