Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
1

Отрисовка примитивов в чужом приложении d3d9

20.07.2017, 21:58. Показов 1970. Ответов 5

Всем доброго времени суток! Есть задача вывести примитив в чужом приложении. Хук работает прекрасно, все отрисовывается, но только не примитив. Прошу правок в мой листинг отрисовки примитива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    
Vertex3D Triangle[] = 
    {
        { 10.0f, 10.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) },
        { 120.0f, 10.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) },
        { 120.0f, 120.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) },
        { 10.0f, 120.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0) }
    };
    LPDIRECT3DVERTEXBUFFER9 vBuf = NULL;
    void* Verts = NULL;
    dev->CreateVertexBuffer(sizeof(Triangle), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vBuf, 0);
    vBuf->Lock(0, 0, &Verts, 0);
    memcpy(Verts, Triangle, sizeof(Triangle));
    vBuf->Unlock();
    dev->SetStreamSource(0, vBuf, 0,  sizeof(Vertex3D));
    dev->SetFVF(D3DFVF_CUSTOMVERTEX);
    dev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 1);
Структура Vertex3D:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Vertex3D
{
    Vertex3D() { }
    Vertex3D(float x, float y, float z,/* float w,*/ DWORD color)
    {
        X = x;
        Y = y;
        Z = z;
        //W = w;
        Color = color;
    }
    float X;
    float Y;
    float Z;
    //float W;
    DWORD Color;
};
Определение D3DFVF_CUSTOMVERTEX:

C++
1
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
Present вызывал, тоже не помогло. Быть может есть ссылка на теорию по этому поводу?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2017, 21:58
Ответы с готовыми решениями:

Отрисовка примитивов в чужом приложении d3d9
Всем доброго времени суток! Есть задача вывести примитив в чужом приложении. Хук работает...

Реализовать хук на D3D9 (DirectX9), чтобы выводить сообщения в чужом окне (игре)
Здравствуйте уважаемые гуру дотНЕТа. Помогите плиз. Хочу реализовать хук на D3D9 (DirectX9),...

Отрисовка примитивов PictureBox
Здравствуйте! Нужда заставила разобраться с принципом рисования элементарных примитивов двумерного...

Отрисовка большого количества примитивов
Требуется отрисовать в WPF некоторое количество прямоугольников, с заданными высотой и шириной и...

5
1363 / 1000 / 316
Регистрация: 28.07.2012
Сообщений: 2,769
20.07.2017, 23:39 2
novice07,
1) Проверь возвращаемые значения каждого из вызванных методов.
2) Проверь отладочный вывод от DirectX.

Добавлено через 5 минут
Цитата Сообщение от novice07 Посмотреть сообщение
Хук работает прекрасно, все отрисовываетс
Что подразумевается под всем? Может у твоего примитива нормали не в ту сторону торчат, и поэтому он не отображается?
0
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
21.07.2017, 00:35  [ТС] 3
Подразумевается то, что присутствует вывод текста и своеобразное построение квадрата через метод Clear. Текст выводится и нормально проходит Clear
C++
1
2
3
4
5
6
7
    Log->Write("CreateVertexBuffer returns %x", dev->CreateVertexBuffer(sizeof(Triangle), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vBuf, 0));
    Log->Write("Lock returns %x", vBuf->Lock(0, 0, &Verts, 0));
    memcpy(Verts, Triangle, sizeof(Triangle));
    Log->Write("Unlock returns %x", vBuf->Unlock());
    Log->Write("SetStreamSrc returns %x", dev->SetStreamSource(0, vBuf, 0, sizeof(Vertex3D)));
    Log->Write("SetFVF returns %x", dev->SetFVF(D3DFVF_CUSTOMVERTEX));
    Log->Write("DrawPrimitive returns %x", dev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 1));
Данные из лога:

[01:27:31] CreateVertexBuffer returns 0

[01:27:31] Lock returns 0

[01:27:31] Unlock returns 0

[01:27:31] SetStreamSrc returns 0

[01:27:31] SetFVF returns 0

[01:27:31] DrawPrimitive returns 0

Скрин:
Миниатюры
Отрисовка примитивов в чужом приложении d3d9  
0
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
21.07.2017, 01:00  [ТС] 4
Ах да, забыл сказать, что запускал это в GTA:SA. Результат был - черный экран, на нем красный прямоугольник. На момент проскакивает картинка меню. На ощупь запустил игру и все было нормально, только прямоугольник пропадал каждые 8-10 секунд где-то на такое же или меньшее кол-во времени.

Порядок вызова хука:
C++
1
2
3
    
Log->Write("(Main) Адрес EndScene: %X", DirectHook::GetEndScene());
Log->Write("(Main) Ставим хук на EndScene..."); DirectHook::SetHookUp();
Хукаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
DWORD DirectHook::GetEndScene()
{
    DWORD Module = (DWORD)GetModuleHandleA("d3d9.dll");
    DWORD tmp = FindPattern(Module , 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
    DWORD* device;
    memcpy(&device, (void*)(tmp + 2), 4);
    oEndScene = (EndScene)device[42];
    return device[42];
}
 
void DirectHook::SetHookUp()
{
    /* oEndScene хранит указатель на EndScene */
    /* Берем и затираем первые пять байт на прыжок к нам в функцию */
    /* При этом сохраняем пять затертых байт */
    byte* t = (byte*)oEndScene;
    for (int i = 0; i < 5; i++)
        OldByte[i] = *(t + i);//Сохранили пять байт
    DWORD AddrToJmp = (DWORD)nEndScene - (DWORD)oEndScene - 5;
    DWORD s;
    VirtualProtect(t, 8, PAGE_EXECUTE_READWRITE, &s);
    t[0] = 0xE9;//JMP
    *((DWORD*)(t + 1)) = AddrToJmp;
    VirtualProtect(t, 8, s, &s);
}
 
HRESULT WINAPI DirectHook::nEndScene(LPDIRECT3DDEVICE9 dev)
{
    UsersGraphic(dev);
    byte* t = (byte*)oEndScene;
    DWORD s;
    VirtualProtect(t, 8, PAGE_EXECUTE_READWRITE, &s);
    for (int i = 0; i < 5; i++)
        t[i] = OldByte[i];
    VirtualProtect(t, 8, s, &s);
    HRESULT hr = oEndScene(dev);
    SetHookUp();
    return hr;
}
0
1363 / 1000 / 316
Регистрация: 28.07.2012
Сообщений: 2,769
21.07.2017, 23:15 5
Лучший ответ Сообщение было отмечено novice07 как решение

Решение

novice07, хмм. А учел ли ты при отрисовке наличие различных матричных преобразований над координатами?
Твой объект может запросто оказаться за пределами области видимости.
1
1 / 1 / 0
Регистрация: 20.07.2017
Сообщений: 19
21.07.2017, 23:36  [ТС] 6
Да, теперь учел, вопрос закрыт, спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2017, 23:36

Отрисовка графических примитивов QPainter
Всем привет! Помогите решить проблему, надо нарисовать такой рисунок. Пока сделал вот что, но ума...

Простейшая графика в C++: системы координат, отрисовка примитивов
Добрый день. Интересует, как решать на C++ достаточно тривиальные задачи, к примеру, рисовка...

Нажатие на кнопку в чужом приложении
Всем доброго времени суток. Мне нужно нажать на кнопку в чужом приложении и вставить текст в поле....

Управлять мышкой в чужом приложении
Мне надо управлять мышкой в чужом приложении: выставить на определенные координаты и раз в 30мин....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru