Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393

Не могу создать объект DirectInput

20.11.2022, 13:01. Показов 699. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте всем.

Не могу создать объект DirectInput.

Хочу отловить ошибку, из-за которой не получается, создать.

Как лучше это сделать?

C++
1
2
3
4
5
6
7
8
9
10
11
    IDirectInput8* pDirectInput = nullptr;
    if (DirectInput8Create(myhModule, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)& pDirectInput, NULL) != DI_OK) {
 
        switch (pDirectInput) {
        case DI_NOTATTACHED: {printf(" DI_NOTATTACHED  \n\n");
            break;  };
                      break;
        }
        std::cout << "DirectInput8Create failed!" << std::endl;
        return -1;
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2022, 13:01
Ответы с готовыми решениями:

При управлении камерой (DirectInput) объект должен следовать за ней и поворачиваться с помощью мыши
Мнн нужна помощь с DirectX. Мне нужно сделать так, чтобы при управлении камерой( С DirectInput) объект следовал за ней и поворачивался с...

Не могу разобраться с DirectInput для чтения джойстика
Внимание, нубский вопрос:) Хочу дописать одну свою программу, для управления роботом (а я C++/Windows Forms юзал), чтобы она читала...

Не могу создать объект
Доброго времени суток, не могу понять где моя ошибка и в книге все работало, а у меня нет. Есть два файла System и Start. ...

6
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
20.11.2022, 13:08
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
Хочу отловить ошибку
try catch не помогает?
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
21.11.2022, 16:26  [ТС]
Donkix, Donkix, Сделал так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    IDirectInput8* pDirectInput = nullptr;
    if (DirectInput8Create(myhModule, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)& pDirectInput, NULL) != DI_OK) {
        void* outPtr = NULL;
        HRESULT aResult = DirectInput8Create(myhModule, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)& pDirectInput, NULL);
 
        if (aResult != DI_OK) {
            switch (aResult) {
            case DIERR_BETADIRECTINPUTVERSION: printf(" Beta Directinput version"); break;
            case DIERR_INVALIDPARAM: printf(" Invalid Parameter"); break;
            case DIERR_OLDDIRECTINPUTVERSION: printf(" Old Directinput Version"); break;
            case DIERR_OUTOFMEMORY: printf(" Out of Memory"); break;
            case DIERR_ALREADYINITIALIZED: printf(" DIERR_ALREADYINITIALIZED"); break;
            case DIERR_NOAGGREGATION: printf(" DIERR_NOAGGREGATION"); break;
            case DIERR_OTHERAPPHASPRIO: printf(" DIERR_OTHERAPPHASPRIO"); break;
            case DIERR_INPUTLOST: printf(" DIERR_INPUTLOST"); break;
        
            }
 
        }
        std::cout << "\nDirectInput8Create failed!" << std::endl;
        return -1;
    }
выходит ошибка Invalid Parameter
DirectInput8Create failed!
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,120
21.11.2022, 17:28
Егор Щербанов чему равен первый аргумент функции, откуда вы его берёте?

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
#include <Windows.h>
#include <stdio.h>
 
#include <initguid.h>
#include <dinput.h>
#pragma comment(lib, "dinput8")
 
int main()
{
    //HMODULE myhModule = 0;                // вот так ругается на DIERR_INVALIDPARAM
    HMODULE myhModule = GetModuleHandle(0); // а так уже не ругается
 
    IDirectInput8* pDirectInput = 0;
    HRESULT hr = DirectInput8Create(myhModule, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&pDirectInput, 0);
    if (FAILED(hr))
    {
        printf("DirectInput8Create failed!\nerror: 0x%08X", hr);
 
        switch (hr)
        {
            case DIERR_BETADIRECTINPUTVERSION: printf(" Beta Directinput version"); break;
            case DIERR_INVALIDPARAM: printf(" Invalid Parameter"); break;
            case DIERR_OLDDIRECTINPUTVERSION: printf(" Old Directinput Version"); break;
            case DIERR_OUTOFMEMORY: printf(" Out of Memory"); break;
            case DIERR_ALREADYINITIALIZED: printf(" DIERR_ALREADYINITIALIZED"); break;
            case DIERR_NOAGGREGATION: printf(" DIERR_NOAGGREGATION"); break;
            case DIERR_OTHERAPPHASPRIO: printf(" DIERR_OTHERAPPHASPRIO"); break;
            case DIERR_INPUTLOST: printf(" DIERR_INPUTLOST"); break;
        }
 
        return -1;
    }
 
    pDirectInput->Release();
    return 0;
}
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
22.11.2022, 09:06  [ТС]
Так решил.

C++
1
2
    IDirectInput8* pDirectInput = nullptr;
    if (DirectInput8Create((HINSTANCE)GetModuleHandle(0), DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)& pDirectInput, NULL) != DI_OK)
Добавлено через 2 минуты
Ygg, спасибо большое за ваш ответ, только сейчас его увидел.
скажите пожалуйста, как можно отследить нажатия кнопок мышки?
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,120
22.11.2022, 13:49
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
как можно отследить нажатия кнопок мышки?
По разному можно отследить. В классическом приложении через уведомления/сообщения. В играх с помощью опроса состояния кнопок на каждом шаге/кадре. Хакеры, наверное, через хуки что-нибудь ловят. Если вы хотите следить за мышью при её работе в чужом приложении, то вопрос не по адресу, я в таких вещах не разбирался.
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
22.11.2022, 17:33  [ТС]
Ygg, спасибо за подсказку, хочу отловить нажатия мыши и клавиши на клавиатуре.


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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#define WIN32_LEAN_AND_MEAN 
#ifdef _MSC_VER
#pragma warning(disable : 6001)
#pragma warning(disable : 2731)
#define DIRECTINPUT_VERSION 0x0800
#pragma comment(lib, "Dinput8.lib")
#pragma comment(lib, "Dxguid.lib")
#pragma comment(lib, "dbghelp.lib")// C2731.cpp
#endif
#include <dinput.h>
#include <Windows.h>
#include <psapi.h>
#include <iostream>
#include <string>
#include <iostream>
#include <cstdio>
#include <tlhelp32.h>
#include <process.h>
#include <processthreadsapi.h>
#include <thread>
#include <vector>
#include "detours.h"
#include "Menu.h"
#include <dbghelp.h> //needed for ImageNtHeader
#include "Memory.h"
#pragma comment(lib, "CasualLibrary.lib")
#pragma comment(lib, "detours.lib")
 
using namespace std;
 
HMODULE myhModule;
//_stdcall
DWORD EjectThread(LPVOID pParameter) {
    Sleep(100);
    FreeLibraryAndExitThread(myhModule, 0);
}; 
uintptr_t getFunctionAddress(LPDIRECTINPUTDEVICE8 lpdid, int index) {
    uintptr_t avTable = Internal::Memory::read<uintptr_t>(lpdid);
    uintptr_t pFunction = avTable + index * sizeof(uintptr_t);
    return Internal::Memory::read<uintptr_t>(pFunction);
}
uintptr_t getfunctionaddress(LPDIRECTINPUTDEVICE8 Ipdid, int index) {
    uintptr_t avTable = Internal::Memory::read<uintptr_t>(Ipdid);
    uintptr_t pFunction = avTable + 9 * sizeof(uintptr_t);
    return Internal::Memory::read<uintptr_t> (pFunction);
}
 
typedef HRESULT(__stdcall* GetDeviceStateT)(IDirectInputDevice8* pThis, DWORD cbData, LPVOID lpvData);
GetDeviceStateT pGetDeviceState = nullptr; //pointer to original function
bool blockMouse = false; typedef HRESULT(__stdcall* GetDeviceDataT)(IDirectInputDevice8*, DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD);
GetDeviceDataT pGetDeviceData = nullptr; bool blockKeyboard = false;
 
HRESULT __stdcall hookGetDeviceState(IDirectInputDevice8* pThis, DWORD cbData, LPVOID lpvData) {
    HRESULT result = pGetDeviceState(pThis, cbData, lpvData);
 
    if (result == DI_OK) {
        if (cbData == sizeof(DIMOUSESTATE)) {//caller is a mouse
            if (((LPDIMOUSESTATE)lpvData)->rgbButtons[0] != 0) {
                std::cout << "[LMB]" << std::endl;
            }
            if (((LPDIMOUSESTATE)lpvData)->rgbButtons[1] != 0) {
                std::cout << "[RMB]" << std::endl;
            }
        }
        if (cbData == sizeof(DIMOUSESTATE2)) {//caller is also a mouse but different struct
            if (((LPDIMOUSESTATE2)lpvData)->rgbButtons[0] != 0) {
                std::cout << "[LMB2]" << std::endl;
            }
            if (((LPDIMOUSESTATE2)lpvData)->rgbButtons[1] != 0) {
                std::cout << "[RMB2]" << std::endl;
            }
        }
        if (blockMouse) { // I know that in our case the struct is LPDIMOUSESTATE2
            ((LPDIMOUSESTATE2)lpvData)->rgbButtons[0] = 0;
            ((LPDIMOUSESTATE2)lpvData)->rgbButtons[1] = 0;
        }
    }
 
    return result;
};
 
 
BOOL CALLBACK DIEnumDevicesProc(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) {
    wchar_t wGUID[40] = { 0 };
    char cGUID[40] = { 0 };
 
    if (StringFromGUID2(lpddi->guidProduct, wGUID, ARRAYSIZE(wGUID)))
    {
        WideCharToMultiByte(CP_ACP, 0, wGUID, -1, cGUID, 40, NULL, NULL);
        std::cout << "ProductName: " << lpddi->tszProductName << std::endl;
        /*std::cout << "ProductGuid: " << cGUID << std::endl << std::endl;*/
    }
    return DIENUM_CONTINUE;
}
HRESULT __stdcall hookGetDeviceData(IDirectInputDevice8* pThis, DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) {
    HRESULT result = pGetDeviceData(pThis, cbObjectData, rgdod, pdwInOut, dwFlags);
    cout << " ok " << endl;
    if (result == DI_OK) {
        for (int i = 0; i < *pdwInOut; ++i) {
            if (LOBYTE(rgdod[i].dwData) > 0) { //key down
                if (rgdod[i].dwOfs == DIK_W) {
                    std::cout << "[w] pressed" << std::endl;
                }
            }
            if (LOBYTE(rgdod[i].dwData) == 0) { //key up
                if (rgdod[i].dwOfs == DIK_W) {
                    std::cout << "[w] released" << std::endl;
                }
            }
        }
        if (blockKeyboard) {
            *pdwInOut = 0; //set array size 0
        }
    }
    return result;
}
 
int main() {
    AllocConsole();//Выделяет новую консоль для вызывающего процесса. 
    FILE* fp;   freopen_s(&fp, "CONOUT$", "w", stdout); // output only
    
    IDirectInput8* pDirectInput = nullptr;
    LPDIRECTINPUTDEVICE8 lpdiMouse;
    if (DirectInput8Create((HINSTANCE)GetModuleHandle(0), DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)& pDirectInput, NULL) != DI_OK) {
        std::cout << "\nDirectInput8Create failed!" << std::endl;   return -1;  }
    
    if (pDirectInput->CreateDevice(GUID_SysMouse, &lpdiMouse, NULL) != DI_OK) { pDirectInput->Release();
        std::cout << "CreateDevice failed!" << std::endl;       return -1;  }
 
    //hook
    pGetDeviceState = (GetDeviceStateT)DetourFunction((PBYTE)getFunctionAddress(lpdiMouse, 9), (PBYTE)hookGetDeviceState);
    pGetDeviceData = (GetDeviceDataT)DetourFunction((PBYTE)getFunctionAddress(lpdiMouse, 10), (PBYTE)hookGetDeviceData);
    
 
    while (true) {  Sleep(100);
        if (GetAsyncKeyState(VK_NUMPAD0))
            break;
        if (GetAsyncKeyState(VK_NUMPAD3)) {
            std::cout << "Enumerating Devices ..." << std::endl;
            if (!pDirectInput->EnumDevices(DI8DEVCLASS_ALL, DIEnumDevicesProc, NULL, DIEDFL_ALLDEVICES) == DI_OK) {
                std::cout << "... failed!" << std::endl; break; }
            Sleep(3100);
        }
    }
    //cleanup
    pDirectInput->Release();
    lpdiMouse->Release();
    DetourRemove((PBYTE)pGetDeviceState, (PBYTE)hookGetDeviceState);
    DetourRemove((PBYTE)pGetDeviceData, (PBYTE)hookGetDeviceData);
    fclose(fp);
    FreeConsole();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2022, 17:33
Помогаю со студенческими работами здесь

Не могу создать объект класса
Не работает код. Я создал 1 основной класс и 2 производных. Как только в функции main пытаюсь создать объект любого класса, мне выдаёт...

Не могу создать ссылку на объект в массиве
class Row { public: Row(){} Row( int l ) { arr = new double; length = l; }

Не могу создать объект класса подключаемой сборки
Изначально создал одну сборку с абстрактным классом Car namespace CarLibrary { public enum EngineState { ...

Проблеммы с DCOM / MTS: не могу создать объект.
У меня вот какие проблеммы : Поставил я на одной машине NT Server4.0 вместе с MTS и запросто с других машин обращаюсь к COM...

Cannot be resolved to a type. Не могу создать объект класса , и использовать его методы
Проблема в том что в главном файле я не могу создать объект класса SampleServerClass. SV1 компилятор видит как неинициолизорованную...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru