Как управлять клавиатурой в Minecraft с помощью Pynput

Я пытаюсь сделать макрос в Minecraft с помощью pynput, но кажется, что pynput не нажимает правильные кнопки на клавиатуре. Я знаю это, потому что, когда я запускал (фрагмент кода 1) при настройке элементов управления слота Hotbar 3, он отображался как странный символ вместо числа. (см. рисунок) Есть ли способ заставить pynput нажимать правильные кнопки?

# Code snippet 1
import time
from pynput.keyboard import Controller

time.sleep(7) # this is just so I have time to switch to minecraft before it activates

board = Controller()
board.press('2')
time.sleep(.1)
board.release('2')

minecraft читает board.press('2') как soh\soh]soh

Вместо '2' я также попробовал KeyCode(49) и получил тот же результат. Он распознается правильно компьютером, как показано keycode.info и блокнотом.
Когда я заменил '2' на 'e', Minecraft распознал его как '2' и даже нажал на кнопку, так что теперь я еще больше запутался.

Дополнительные примечания:

  • На данный момент я просто установлю элементы управления на то, что pynput дает minecraft, чтобы мой макрос работал, но я бы предпочел иметь возможность использовать кнопки вне макроса.
  • Щелчок и прокрутка Pynput работают нормально.
  • Я не использую мышь для своего макроса, но если вы знаете о мыши, здесь есть вопрос о stackOverflow: Как управлять мышью в Minecraft с помощью Python?
  • Для тех, кому интересно, я делаю этот макрос, чтобы быстро опорожнять ведра с водой после того, как я использовал их для удаления области воды в океане.

person Jelly Joe    schedule 22.05.2020    source источник


Ответы (2)


Я думаю, что самый простой способ - использовать pydirectinput.

pydirectinput точно такой же, как pyautogui. Просто его имя изменилось и он может работать с играми, использующими DirectX (minecraft, roblox).

Чтобы использовать его, вы можете просто сделать

import pydirectinput
import pyautogui
import time

time.sleep(2)#so u can switch to your game

pydirectinput.keyDown('v')
time.sleep(0.5)
pydirectinput.keyUp('v)
person PeanutInANutshell    schedule 18.06.2020

Хотя я могу ошибаться в этом, основываясь на этом сообщении о переполнении стека, я считаю что pynput выводит символы как коды клавиш win32, которые, хотя они работают для таких программ, как блокнот или keycode.info, не кажутся для работы с настройкой управления minecraft.

Если вы согласны с использованием библиотеки, отличной от pynput, я обнаружил, что pywinauto правильно вводит ключи в minecraft.

from pywinauto import keyboard
import time

time.sleep(3) #A short wait to allow me to switch to minecraft

keyboard.send_keys("{2 down}" "{2 up}") #replace 2 with whatever key you want to press

Выше приведен код, который я использовал во время тестирования, и я обнаружил, что он работает правильно при попытке установить элементы управления.

person thumperfuzzy    schedule 23.05.2020
comment
спасибо за Ваш ответ. Win32 является хорошим объяснением того, что происходит. К сожалению, я не могу использовать pywinauto, потому что у меня python 3.7, но я попробую другие библиотеки. pywinauto выдал мне длинную ошибку, заканчивающуюся на: TypeError: item 2 in _argtypes_ passes a union by value, which is unsupported. - person Jelly Joe; 24.05.2020
comment
@JellyJoe Извините за это, согласно этой статье stackoverflow.com/questions/60588615/ в python 3.7.6 и 3.8.1 есть ошибка, из-за которой выдается эта ошибка, а 3.8.2 возвращается к неправильной версии. Я использовал 3.8.2 во время тестирования, поэтому у меня это работало, но, видимо, не так, как должно было. Кроме того, извините за то, что ссылка является просто ссылкой, я не могу сделать ссылку текстовой на моем телефоне. - person thumperfuzzy; 27.05.2020