Ответы пользователя по тегу Боты
  • Есть ли аналог библиотеки pyautogui на C++ под windows?

    QWERTYUIOPas
    @QWERTYUIOPas
    КраткоОСеБе
    Есть. Python.h называется.
    Но если прям чистый С++, то делаете скрин, находите на нём изображение из файла, тыкаете мышью.
    шаг1. Скрин
    https://ru.stackoverflow.com/questions/627095/Как-...
    void CaptureScreen(){
    // Определение контекстов
    HDC ScreenDC = GetDC(0);
    HDC MemoryDC = CreateCompatibleDC(ScreenDC);
    
    // Фиксация размеров экрана
    int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    
    // Создание и частичное заполнение структуры формата
    BITMAPINFO BMI;
    BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    BMI.bmiHeader.biWidth = ScreenWidth;
    BMI.bmiHeader.biHeight = -ScreenHeight; // Отрицательное значение высоты, чтобы изображение не было перевёрнутым
    BMI.bmiHeader.biSizeImage = ScreenWidth * ScreenHeight * 3; // Ширина * Высота * Количество_цветов_на_пиксель
    BMI.bmiHeader.biCompression = BI_RGB;
    BMI.bmiHeader.biBitCount  = 24;
    BMI.bmiHeader.biPlanes = 1;
    
    ScreenshotSize = BMI.bmiHeader.biSizeImage; // ScreenshotSize - глобальная переменная типа int, может меняться в ходе выполнения программы
    unsigned char *ImageBuffer; // Указатель на блок данных BGR, управляемый HBITMAP (да, именно BGR - не RGB)
    HBITMAP hBitmap = CreateDIBSection(ScreenDC,&BMI,DIB_RGB_COLORS,(void**)&ImageBuffer,0,0);
    SelectObject(MemoryDC, hBitmap);
    BitBlt(MemoryDC, 0, 0, ScreenWidth, ScreenHeight, ScreenDC , 0, 0, SRCCOPY);
    
    // Контексты больше не нужны
    DeleteDC(MemoryDC);
    ReleaseDC(NULL, ScreenDC);
    
    // Если требуется RGB вместо BGR - следующий цикл перевернёт нужные байты
    for(int i = 0; i < ScreenshotSize; i += 3){
        unsigned char ColorValue = ImageBuffer[i];
        ImageBuffer[i] = ImageBuffer[i + 2];
        ImageBuffer[i + 2] = ColorValue;
    }
    
    // Используем ImageBuffer как нам хочется... после удаляем его хендлер (HBITMAP) для избежания утечки памяти
    DeleteObject(hBitmap);
    }
    шаг2. Поиск на скрине

    Тут всё сложнее. Я думаю так:
    Получение Х
    1. преобр. скрин в битмап
    2. преобр. изобр в битмап
    3. извлечь первые \ширина_изобр\ байт из битмапа изображения
    4. разделить битмап скрина на куски \ширина_скрина\ байт
    5. пройтись по кускам битмапа скрина, пытаясь найти индекс первых \ширина_изобр\ байт из битмапа изображения
    6. Вы получили Х
    Получение У
    повернуть оба изобр. на 90гр. влево
    1. преобр. скрин в битмап
    2. преобр. изобр в битмап
    3. извлечь первые \высота_изобр\ байт из битмапа изображения
    4. разделить битмап скрина на куски \высота_скрина\ байт
    5. пройтись по кускам битмапа скрина, пытаясь найти индекс первых \высота_изобр\ байт из битмапа изображения
    6. Вы получили У
    7. повернуть оба изобр. на 90гр. вправо
    шаг3. Тык мышью
    1. clickХ=Х+(\ширина_изобр\)/2
    2. clickY=Y+(\высота_изобр\)/2
      https://ru.stackoverflow.com/questions/1127812/Как...
    скармливает состояние поля С++ exe-шнику решателю

    А не лучше сделать ДЛЛ и импорт ДЛЛ из питона?
    from ctypes import *
    pasyansbot=CDLL("пасьянс.DLL")
    
    pasyans.reshit(['Sobakas', 'Koshkas'], ['Linux', 'Windows'])
    Ответ написан
  • С чем может быть связана ошибка "asyncio.exceptions.CancelledError"?

    QWERTYUIOPas
    @QWERTYUIOPas
    КраткоОСеБе
    Не нужны скобки после main, а то Вы не функцию, а None передаёте:

    asyncio.run(main())

    А надо так:

    asyncio.run(main)
    Ответ написан