Другое С/С++ Вопрос - Ответ

Тема в разделе "C/C++", создана пользователем Jesik, 10 май 2013.

  1. CatKnight

    CatKnight Интересующийся

    Регистрация:
    26 ноя 2015
    Сообщения:
    116
    Симпатии:
    26
    У меня вопрос насчёт выгрузки имгуи. Я посмотрел, в этой теме имгуи выгружается в GameDestructorCallback. Но там же пишется, что деструктор не вызывается при выходе из игры, и советуется выгружать его в DLL_PROCESS_DETACH. Собственно, в чём вопрос: нужно ли использовать оба способа одновременно? У меня в таком случае при выходе идёт краш игры. Если же оставить один DLL_PROCESS_DETACH, то в целом всё нормально. Как тут быть?
     
  2. Rinat_Namazov

    Rinat_Namazov ( ͡° ͜ʖ ͡°)
    Всефорумный модератор

    Регистрация:
    9 авг 2015
    Сообщения:
    1.134
    Симпатии:
    576
    Сделать мьютекс с проверкой, если уже вызван деструктор, то ничего не делать.
     
    cakebou и CatKnight нравится это.
  3. Natami

    Natami Свой человек

    Регистрация:
    2 ноя 2018
    Сообщения:
    364
    Симпатии:
    22
    Нажимаю ctrl + f5 (чтобы скомпилировать), вылазит (см.скрин). Не особо разобрался.
     

    Вложения:

  4. Harryss

    Harryss Знающий

    Регистрация:
    7 мар 2015
    Сообщения:
    231
    Симпатии:
    23
    дак с SF API работают на Visual Studio, на IDE, а у тебя, судя по скриншоту, VS Code.
     
    CatKnight нравится это.
  5. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26 окт 2013
    Сообщения:
    3.199
    Симпатии:
    3.203
  6. checkdasound

    Проверенный

    Регистрация:
    12 янв 2018
    Сообщения:
    912
    Симпатии:
    259
    Есть адрес (0xB700F0), по которому находится ид модели машины, в которой ты находишься, но он не работает на велосипеды и мотоциклы. Есть ли аналоги и как узнать ид модели, если ты сидишь на двухколесном транспорте?

    upd. уже нашел
    
    unsigned int CurrentVehiclePointer = *(unsigned int*)0xBA18FC;
    unsigned short model = *(unsigned short*)(CurrentVehiclePointer + 34);
    
     
    #3471 checkdasound, 12 апр 2019
    Последнее редактирование: 21 апр 2019
  7. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    78
    Симпатии:
    57
    GUI::style() must be called in render
     
  8. Vintik

    Vintik Участник

    Регистрация:
    18 авг 2017
    Сообщения:
    9
    Симпатии:
    1
    Всем здравствуйте. Надеюсь, эксперты помогут мне в решении проблемы. Суть в том, что хочу как-то использовать встоенные в GTA SA функции (пример: написать белый текст снизу экрана) своей программой. У DarkP1xel`я заметил следующее:
    Но это для DLL библиотеки, я же хочу для стандартного "консольного приложения".
     
  9. rumpate

    rumpate Активный участник

    Регистрация:
    17 мар 2019
    Сообщения:
    34
    Симпатии:
    0
    Как сделать рандомный слип например от 50 до 100 мс?
     
  10. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    78
    Симпатии:
    57
    use rand() % 100
     
  11. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26 окт 2013
    Сообщения:
    3.199
    Симпатии:
    3.203
    Google: CreateRemoteThread
     
  12. cakebou

    cakebou Знающий

    Регистрация:
    4 апр 2017
    Сообщения:
    236
    Симпатии:
    40
    Как получить коорды объекта / модели? Попытался сам написать, что-то не то вообщем
    float pos[3];
    
        for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
        {
            if (SF->getSAMP()->getInfo()->pPools->pObject->iIsListed[i] != 1)
                continue;
            if (SF->getSAMP()->getInfo()->pPools->pObject->object[i] == NULL)
                continue;
            if (SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity == NULL)
                continue;
    
            pos[0] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[0];
            pos[1] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[1];
            pos[2] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[2];
     
  13. SiTrak

    SiTrak Интересующийся

    Регистрация:
    14 янв 2018
    Сообщения:
    139
    Симпатии:
    42
                            if (pObj->iModel == objes[4])
                            {
                                memcpy(pos, &SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity->base.matrix[12], sizeof(float)* 3);
                                //    uint16_t    model_id = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity->base.model_alt_id;
    
    
                                SF->getGame()->convert3DCoordsToScreen(position[0], position[1], position[2], &obmypos[0], &obmypos[1]);
    
                                SF->getGame()->convert3DCoordsToScreen(pos[0], pos[1], pos[2], &obsreen[0], &obsreen[1]);
                                if (IsOnScreen(i))
                                {
                                    SF->getRender()->DrawLine(obmypos[0], obmypos[1], obsreen[0], obsreen[1], sizelin[4], 0xFF00FF00);
                                }
                            }
     
    cakebou нравится это.
  14. index

    index Постоянный участник

    Регистрация:
    5 мар 2018
    Сообщения:
    64
    Симпатии:
    21
    Небольшая абстрактная задачка: имеется объект Cell, полем которого является указатель на объект (pMan) одного из возможных других классов с разным поведением и полями (virtual не предлагать :) ). Когда указатель на Cell передадут в какую-либо функцию (в приведенном примере все происходит в main) эта функция должна будет вызывать конкретный метод объекта класса, на который указывает pMan, но в зависимости от того, на какой класс там вообще идет указание.
    Код (не цепляйтесь к тому, что все паблик, суть вопроса в самой концепции):
    #include <iostream>
    using namespace std;
    
    class Man1 {
    public:
        void do1() {
            cout << "Man1" << endl;
        }
    };
    
    class Man2 {
    public:
        void do2() {
            cout << "Man2" << endl;
        }
    };
    
    class Cell {
    public:
        enum class Type {
            man1, man2
        }; // Всевозможные типы
    
        Type type;
        void *pMan; // Указатель на Man1 или Man2, в зависимости от того, что находится в type
    
        Cell(Type x, void *px) : type(x), pMan(px) {}
    };
    
    int main(void)
    {
        Cell *cell = new Cell(Cell::Type::man2, new Man2);
    
        if(cell->type == Cell::Type::man1)       // false
            static_cast<Man1*>(cell->pMan)->do1();
        else if (cell->type == Cell::Type::man2) // true
            static_cast<Man2*>(cell->pMan)->do2(); // выведет Man2
        return 0;
    }
    И сам вопрос: как реализовать подобную вещь более адекватно и канонично? В приведенном примере конструктор Cell может схавать
    Cell(Cell::Type::man1, new Man2);
    и в дальнейшем получить неопределенное поведение. Хотелось бы видеть подобные ошибки на этапе компиляции.
     
    #3479 index, 15 апр 2019
    Последнее редактирование: 15 апр 2019
  15. babulya

    babulya Знающий

    Регистрация:
    30 янв 2018
    Сообщения:
    202
    Симпатии:
    244
    Как из данной строки получить "97.1445.1541.67" ?
    {"as":"AS21127 JSC \"Zap-Sib TransTeleCom\", FFFFFFF","city":"FFFFFFF","country":"SSSSSS","countryCode":"RU","isp":"JSC \"Zap-Sib TransTeleCom\"","lat":12.1234,"lon":23.34,"org":"JSC Zap-Sib TransTeleCom","query":"97.1445.1541.67","region":"WER","regionName":"QWERTY","status":"success","timezone":"Asia/ESFFF","zip":"653008"}
     
  16. imring

    imring чо тут
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.833
    Симпатии:
    1.216
    https://github.com/nlohmann/json
     
  17. babulya

    babulya Знающий

    Регистрация:
    30 янв 2018
    Сообщения:
    202
    Симпатии:
    244
    через регулярки можно же вроде без json. На LUA делал - работало.
    ip = text:match('"query":"(.*)","region"')
     
  18. Natami

    Natami Свой человек

    Регистрация:
    2 ноя 2018
    Сообщения:
    364
    Симпатии:
    22
    DLL

    Есть ли уроки по созданию меню (не imgui)?
     
  19. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    78
    Симпатии:
    57
    take a look in sobeit source or check unknown cheats -> directx forum
     
    Natami нравится это.
  20. san0

    Друг

    Регистрация:
    15 дек 2013
    Сообщения:
    396
    Симпатии:
    291
    Мне кажется, немножко детали упущены по поводу того, как это все должно использоваться. Это к тому, что, возможно, задачу можно будет свести к использованию обвертки с помощью std::bind или лямбда-выражения, либо же, всегда применить другую парадигму.

    В любом случае, хотелось бы посоветовать либо использовать типобезопасный variant
    
    #include <variant>
    using Cell = std::variant<Man1*, Man2*>;
    
    void usage_one(Cell cell) {
        if (auto man1 = std::get_if<Man1*>(&cell)) {
            (*man1)->do1();
        } else if (auto man2 = std::get_if<Man2*>(&cell)) {
            (*man2)->do2();
        }
    }
    Либо, если очень хочется написать обвертку, то что-то такое
    
    #include <type_traits>
    
    namespace std {
        template <class T, class... R>
        struct is_any : std::disjunction<std::is_same<T, R>...> {};
    }
    
    template <typename C>
    class CellWrapper {
    public:
        C* pMan;
     
        CellWrapper(C* ptr) : pMan(ptr) {
             // static_assert(std::is_class<C>::value);
             static_assert(std::is_any<C, Man1, Man2>::value,
                 "CellWrapper could be created only with Man1 and Man2"
             );
        };
     
        C* operator->() {
            return this->pMan;
        }
    };
    
    template<typename C>
    void usage_two(CellWrapper<C>* cell) {
        if constexpr (std::is_same<C, Man1>()) {
            (*cell)->do1();
        } else if constexpr (std::is_same<C, Man2>()) {
            (*cell)->do2();
        }
    }
    Использование
    
    int main(void) {
        {
            auto cell = Cell(new Man1);
            usage_one(cell);
        }
        {
            auto cell = CellWrapper(new Man2);
            usage_two(&cell); // как и просилось, именно указатель
        }
    }
    
    Поправьте, если это не то, что требовалось.
    P.S. В примерах выше по причине использования new была продемонстрирована утечка памяти
     
    #3485 san0, 18 апр 2019
    Последнее редактирование: 20 апр 2019
    index нравится это.
  21. index

    index Постоянный участник

    Регистрация:
    5 мар 2018
    Сообщения:
    64
    Симпатии:
    21
    Есть массив (обертка не подойдет) объектов Cell. Из этого массива произвольным образом выбирается элемент, и, в зависимости от типа ассоциированного с ним объекта другого класса, выполняются определенные действия. По сути, полиморфизм времени выполнения. На псевдокоде это выглядит так:
    // Cell type1 fileds: index, name, doSmth11(), doSmth12()
    // Cell type2 fileds: cost, group, doSmth21(), doSmth22()
    
    Cell cellArr[N];
    fill(cellArr);
    a = cellArr[random(0,N-1)];
    if (a.type == type1)
    {
      a.doSmth11();
      a.doSmth12();
    }
    else if (a.type == type2)
    {
      a.doSmth21();
      a.doSmth22();
    }
    Пример больше подходит для языков с динамической типизацией, но хотелось бы увидеть реализацию подобного на c++.
    upd: На cppReference ничего об этом не сказано. Также безрезультатно гуглил в других сточниках. Можно поинтересоваться, откуда информация?
     
    #3486 index, 18 апр 2019
    Последнее редактирование: 19 апр 2019
  22. san0

    Друг

    Регистрация:
    15 дек 2013
    Сообщения:
    396
    Симпатии:
    291
    Последний из способов, наверное, наиболее благоприятный по причине низкой посадки по рантайму
    
    #include <iostream>
    #include <vector>
    #include <any>
    #include <typeindex>
    #include <typeinfo>
    
    struct Man1 {
        unsigned long long index = 0LL;
        std::string name = "Name";
        void doSmth11() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->index << std::endl;
        }
       
        void doSmth12() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->name << std::endl; 
        }
    };
    
    
    struct Man2 {
        unsigned long long cost = 2222LL;
        std::string group = "Group";
        void doSmth21() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->cost << std::endl;
        }
       
        void doSmth22() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->group << std::endl; 
        }
    };
    
    int main() {
        std::vector<std::any> pool;
       
        pool.push_back(Man1{});
        pool.push_back(Man2{});
       
        for (auto&& e : pool) {
            if (std::type_index(e.type()) == std::type_index(typeid(Man1))) {
                auto restoredMan1 = std::any_cast<Man1>(e);
                restoredMan1.doSmth11();
                restoredMan1.doSmth12();
            } else if (e.type().hash_code() == typeid(Man2).hash_code()) {
                auto restoredMan2 = std::any_cast<Man2>(e);
                restoredMan2.doSmth21();
                restoredMan2.doSmth22();
            }
        }
    }
    
    
    
    #include <iostream>
    #include <vector>
    
    struct ManEssential { 
        virtual void __unused(void) {};
    };
    
    struct Man1 : ManEssential {
        unsigned long long index = 0LL;
        std::string name = "Name";
        void doSmth11() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->index << std::endl;
        }
       
        void doSmth12() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->name << std::endl; 
        }
    };
    
    
    struct Man2 : ManEssential {
        unsigned long long cost = 2222LL;
        std::string group = "Group";
        void doSmth21() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->cost << std::endl;
        }
       
        void doSmth22() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->group << std::endl; 
        }
    };
    
    int main() {
        std::vector<ManEssential*> pool;
       
        pool.push_back(new Man2);
        pool.push_back(new Man1);
       
        for (auto&& e : pool) {
            if (auto restoredMan1 = dynamic_cast<Man1*>(e)) {
                restoredMan1->doSmth11();
                restoredMan1->doSmth12();
            } else if (auto restoredMan2 = dynamic_cast<Man2*>(e)) {
                restoredMan2->doSmth21();
                restoredMan2->doSmth22();
            }
        }
    }
    
    
    
    #include <iostream>
    #include <vector>
    
    struct Man1 {
        unsigned long long index = 0LL;
        std::string name = "Name";
        void doSmth11() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->index << std::endl;
        }
       
        void doSmth12() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->name << std::endl; 
        }
    };
    
    
    struct Man2 {
        unsigned long long cost = 2222LL;
        std::string group = "Group";
        void doSmth21() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->cost << std::endl;
        }
       
        void doSmth22() {
            std::cout << __PRETTY_FUNCTION__ << ' ' << 
                this->group << std::endl; 
        }
    };
    
    enum class ManSubtype {
        kMan1,
        kMan2
    };
    
    struct ObjectSlicing : public Man1, public Man2 {
        const ManSubtype type;
    
        template<typename T> 
        ObjectSlicing(const T&& man) : type([=] {
            if constexpr (std::is_same<T, Man1>()) {
                return ManSubtype::kMan1;
            } else if constexpr (std::is_same<T, Man2>()) {
                return ManSubtype::kMan2;
            }
        }()) 
        {}
    };
    
    int main() {
        std::vector<class ObjectSlicing> pool;
       
        pool.push_back(ObjectSlicing(Man1{}));
        pool.push_back(ObjectSlicing(Man2{}));
       
        for (auto&& e : pool) {
            if (e.type == ManSubtype::kMan1) {
                Man1 restoredMan1 = e;
                restoredMan1.doSmth11();
                restoredMan1.doSmth12();
            } else if (e.type == ManSubtype::kMan2) {
                Man2 restoredMan2 = e;
                restoredMan2.doSmth21();
                restoredMan2.doSmth22();
            }
           
        }
    }
    
    
    Первоапрельская шутка 2018 года, не воспринимайте всерьез
    http://modernescpp.com/index.php/no-new-new
    samp.dll + 0x66655 =>
    patch 5 bytes to mov eax,00000010, where 0x10 - Y offset
    samp.dll + 0x66668 =>
    patch 5 bytes to mov eax,00000020, where 0x20 - X offset
     
    Yuan и index нравится это.
  23. cakebou

    cakebou Знающий

    Регистрация:
    4 апр 2017
    Сообщения:
    236
    Симпатии:
    40
    Дайте функцию бега на сф, пожалуйста не кидайте соб
     
  24. ALF

    ALF
    Проверенный

    Регистрация:
    14 ноя 2017
    Сообщения:
    131
    Симпатии:
    142
    не, ты какую то хрень написал.

    DWORD addrX = samp.dll + 0x6665C;
    DWORD addrY = samp.dll + 0x66645;
     
    Yuan нравится это.
  25. checkdasound

    Проверенный

    Регистрация:
    12 янв 2018
    Сообщения:
    912
    Симпатии:
    259
    Пытаюсь переделать свой скрипт в аси формат. Все сделал, кроме нормальной эмуляции игровых клавиш. Нынешняя эмуляция работает через раз.
    
    #include "main.h"
    
    void __cdecl thread(void *pArg)
    {
       while (true)
       {
           Sleep(1);
           if (isKeyDown(0x31))
           {
               if (IsCharOnFoot())
               {
                   SetGameKeyState(0x20, 255);
                   Sleep(10);
                   SetGameKeyState(0x20, 0);
                   GTAfunc_showStyledText("ON FOOT", 2000, 1);
               }
           }
           if (isKeyDown(0xA0))
           {
               if (IsCharInAnyCar())
               {
                   type = CurrentVehicleModelType();
                   if (type == 1)
                   {
                       SetGameKeyState(0x20, 255);
                       Sleep(10);
                       SetGameKeyState(0x20, 0);
                       GTAfunc_showStyledText("ON BIKE", 2000, 1);
                   }
                   else if (type == 2) {
                       SetGameKeyState(0x2, -128);
                       Sleep(10);
                       SetGameKeyState(0x2, 0);
                       GTAfunc_showStyledText("ON MOTO", 2000, 1);
                   }
               }
           }
       }
    }
    
    BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
    {
       if (fdwReason == DLL_PROCESS_ATTACH)
       {
           _beginthread(thread, 0, nullptr);
               return TRUE;
       }
    
    }
    

    
    #include <windows.h>
    #include <process.h>
    #include <TlHelp32.h>
    
    DWORD CPed = 0xB6F5F0;
    DWORD CPedStatus = 0x530;
    DWORD ProcID;
    DWORD p1;
    HANDLE hProcess;
    
    unsigned int CurrentVehiclePointer = 0xBA18FC;
    int Model = 0;
    int Status = 0;
    int type;
    unsigned long temp;
    
    int bike[3] = { 481, 509, 510 };
    int moto[11] = { 448, 461, 462, 463, 468, 471, 521, 522, 523, 581, 586 };
    
    using namespace std;
    
    DWORD GetProcId(const char* procname)
    {
       PROCESSENTRY32 pe;
       HANDLE hSnap;
    
       pe.dwSize = sizeof(PROCESSENTRY32);
       hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
       if (Process32First(hSnap, &pe)) {
           do {
               if (strcmp(pe.szExeFile, procname) == 0)
                   break;
           } while (Process32Next(hSnap, &pe));
       }
       return pe.th32ProcessID;
    }
    
    void SetGameKeyState(BYTE key, BYTE state)
    {
       p1 = 0xB73458 + key;
       memset((void*)p1, state, 1);
    };
    
    bool isKeyDown(int key)
    {
       SHORT keyState = GetKeyState(key);
       return (keyState & 0x8000);
    }
    
    void GTAfunc_showStyledText(const char *text, int time, int style)
    {
       ((void(__cdecl *) (const char *text, int time, int style)) (0x0069F2B0)) (text, time, style);
    }
    
    int CurrentPedStatus()
    {
       ProcID = GetProcId("gta_sa.exe");
       hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
    
       ReadProcessMemory(hProcess, reinterpret_cast<LPVOID>(CPed), &temp, sizeof(temp), 0);
       CPedStatus = temp + 0x530;
    
       ReadProcessMemory(hProcess, reinterpret_cast<LPVOID>(CPedStatus), &Status, sizeof(temp), 0);
       return Status;
    }
    
    bool IsCharInAnyCar()
    {
       Status = CurrentPedStatus();
       if (Status == 50)
       {
           return true;
       }
       else
       {
           return false;
       }
    }
    
    bool IsCharOnFoot()
    {
       Status = CurrentPedStatus();
       if (Status == 1)
       {
           return true;
       }
       else
       {
           return false;
       }
    }
    
    int CurrentVehicleModelType()
    {
       unsigned int CurrentVehiclePointer = *(unsigned int*)0xBA18FC;
       unsigned short model = *(unsigned short*)(CurrentVehiclePointer + 34);
       if (IsCharInAnyCar())
       {
           for (int counter = 0; counter < 3; counter++)
           {
               if (model == bike[counter])
               {
                   return 1;
               }
           }
           for (int counter = 0; counter < 11; counter++)
           {
               if (model == moto[counter])
               {
                   return 2;
               }
           }
       } else {
           return 0;
       }
    }
    
    static struct _Keys
    {
       bool        bPressed;
       DWORD       dwStartTime;
    }kPressingKeys[256];
    
    BOOL  State_Key(int Key, DWORD dwTimeOut)
    {
       if (HIWORD(GetKeyState(Key)))
       {
           if (!kPressingKeys[Key].bPressed || (kPressingKeys[Key].dwStartTime && (kPressingKeys[Key].dwStartTime + dwTimeOut) <= GetTickCount()))
           {
               kPressingKeys[Key].bPressed = TRUE;
               if (dwTimeOut > NULL)
                   kPressingKeys[Key].dwStartTime = GetTickCount();
               return TRUE;
           }
       }
       else
           kPressingKeys[Key].bPressed = FALSE;
       return FALSE;
    }
    
     
  26. CleanLegend

    Всефорумный модератор

    Регистрация:
    28 мар 2013
    Сообщения:
    313
    Симпатии:
    582
    Для нормальной эмуляции клавиш нужно хукать функцию, которая отвечает за нажатие игровых клавиш. https://git.prime-hack.net/SR_team/AsiBase/src/branch/master/sys/SREvents.cpp#L432
    Как вариант можешь вызывать функции SF или WinAPI. и не используй RPM и WPM в dll
     
    SiTrak, checkdasound и imring нравится это.
  27. ๖ۣۣۜШурик

    ๖ۣۣۜШурик Интересующийся

    Регистрация:
    20 янв 2017
    Сообщения:
    197
    Симпатии:
    32
    Столкнулся с такой проблемой:
    - В цикле стоит проверка на зажатую клавишу (VK_LMENU), если нажата - выводит сообщение. Если же я с рабочего стола перейду в игру (через Alt + Tab), то это сообщение будет выводиться до первого нажатия на клавишу Alt. Использовал функцию SF->getGame()->isKeyDown и ImGui::IsKeyDown - результат один.

    P.S. Замечу, сама игра не обрабатывают эту клавишу (ну тип персонаж не ходит на альте), а данные функции обрабатывают.

    Есть ли способ решить данную проблему?
     
  28. qojqva

    qojqva Активный участник

    Регистрация:
    18 янв 2017
    Сообщения:
    46
    Симпатии:
    1
    Можно на c++ сделать биндер для рп?
     
  29. SiTrak

    SiTrak Интересующийся

    Регистрация:
    14 янв 2018
    Сообщения:
    139
    Симпатии:
    42
    Ну да
     
  30. qojqva

    qojqva Активный участник

    Регистрация:
    18 янв 2017
    Сообщения:
    46
    Симпатии:
    1
    Почему я ни разу не видел биндер на С++?
     
  31. MrPlayerYT

    MrPlayerYT Новичок

    Регистрация:
    19 апр 2019
    Сообщения:
    4
    Симпатии:
    1
    Зачем использовать пушку для стрельбы по воробьям?
     
    social enemy нравится это.
  32. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    78
    Симпатии:
    57
    located in VC++ Directories

    [​IMG]
     
    social enemy нравится это.
  33. qojqva

    qojqva Активный участник

    Регистрация:
    18 янв 2017
    Сообщения:
    46
    Симпатии:
    1
    Как сделать биндер?
     
  34. mr.krabs

    mr.krabs Местный житель

    Регистрация:
    22 фев 2017
    Сообщения:
    1.311
    Симпатии:
    270
    Вам не сюда
     
  35. hhti

    hhti Свой человек

    Регистрация:
    27 авг 2018
    Сообщения:
    421
    Симпатии:
    29
    первый раз такого извращенца вижу. для биндеров луа и ахк, но не с++