Python鼠标单击以进行游戏(直接输入)

时间:2019-03-02 00:27:10

标签: python directx directinput

我在搜索DirectX游戏的模拟鼠标点击和移动方面进行了大量搜索。我找到了很多有关按键的资料,但没有鼠标资料。实际上,关于直接输入(Simulate Python keypresses for controlling a game)的按键,有一个很好的stackoverflow主题。但是我没有足够的经验来使其在某些位置上的鼠标单击有效。

我尝试了很多python模块,例如pyautogui,win32等。它们无法正常工作。甚至我试图通过将自变量发送到'.ahk'文件到自动热键上单击它,但它不是稳定的,也不是一个好方法。我会为每一个评论表示感谢。我只为这次点击工作了2天,我完全迷路了。谢谢!


我从reddit中找到了这段代码,用于游戏中的点击,但是它也不起作用。

UIView.transition

left_click()函数可以正常工作,但click可以与所有模块一起使用,我需要的是set_pos()可以工作,但不幸的是,

3 个答案:

答案 0 :(得分:1)

对于Directx游戏,如果直接输入有效,则必须对其进行自我测试。

但是使用pywinauto软件包,您可以模拟鼠标点击和鼠标移动。

pywinauto.mouse

要为python 27安装pywinauto软件包,可以使用此bat文件。

install-Pywinauto.bat

C:\Python27\scripts\pip.exe install pywinauto
pause

现在您准备好了。

鼠标左键click.py

import pywinauto
pywinauto.mouse.click(button='left', coords=(0, 0)) 

Double-Left-Mouse-Click.py

import pywinauto
pywinauto.mouse.double_click(button='left', coords=(0, 0))

,如果您将其与AutoPytonLauncher

一起使用

您可以单击桌面上的3d按钮图像,将任何键盘快捷键宏 MouseClicks MouseMovements 发送到Windows应用程序或游戏。 (在活动窗口中没有松动。)

答案 1 :(得分:1)

def move(x=None, y=None, duration=0.25, absolute=True, interpolate=False, **kwargs):

    if (interpolate):
        print("mouse move {}".format(interpolate))
        current_pixel_coordinates = win32api.GetCursorPos()
        if interpolate:
            current_pixel_coordinates = win32api.GetCursorPos()
            start_coordinates = _to_windows_coordinates(*current_pixel_coordinates)

            end_coordinates = _to_windows_coordinates(x, y)
            print("In interpolate")
            coordinates = _interpolate_mouse_movement(
                start_windows_coordinates=start_coordinates,
                end_windows_coordinates=end_coordinates
            )
            print(coordinates)
        else:
            coordinates = [end_coordinates]

        for x, y in coordinates:
            extra = ctypes.c_ulong(0)
            ii_ = Input_I()
            ii_.mi = MouseInput(x, y, 0, (0x0001 | 0x8000), 0, ctypes.pointer(extra))
            x = Input(ctypes.c_ulong(0), ii_)
            ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

            time.sleep(duration / len(coordinates))
    else:
        x = int(x)
        y = int(y)

        coordinates = _interpolate_mouse_movement(
            start_windows_coordinates=(0, 0),
            end_windows_coordinates=(x, y)
        )

        for x, y in coordinates:
            extra = ctypes.c_ulong(0)
            ii_ = Input_I()
            ii_.mi = MouseInput(x, y, 0, 0x0001, 0, ctypes.pointer(extra))
            x = Input(ctypes.c_ulong(0), ii_)
            ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

            time.sleep(duration / len(coordinates))


def _to_windows_coordinates(x=0, y=0):
    display_width = win32api.GetSystemMetrics(0)
    display_height = win32api.GetSystemMetrics(1)

    windows_x = (x * 65535) // display_width
    windows_y = (y * 65535) // display_height

    return windows_x, windows_y

def _interpolate_mouse_movement(start_windows_coordinates, end_windows_coordinates, steps=20):
    x_coordinates = [start_windows_coordinates[0], end_windows_coordinates[0]]
    y_coordinates = [start_windows_coordinates[1], end_windows_coordinates[1]]

    if x_coordinates[0] == x_coordinates[1]:
        x_coordinates[1] += 1

    if y_coordinates[0] == y_coordinates[1]:
        y_coordinates[1] += 1

    interpolation_func = scipy.interpolate.interp1d(x_coordinates, y_coordinates)

    intermediate_x_coordinates = np.linspace(start_windows_coordinates[0], end_windows_coordinates[0], steps + 1)[1:]
    coordinates = list(map(lambda x: (int(round(x)), int(interpolation_func(x))), intermediate_x_coordinates))

将此代码附加到您的代码中,然后使用 move(x,y)调用它。 这是完整代码https://github.com/SerpentAI/SerpentAI/blob/dev/serpent/input_controllers/native_win32_input_controller.py的链接 同样,以管理员权限运行python可能会有所帮助

答案 2 :(得分:0)

我做了很多研究,发现了pyautoit模块。它确实很棒而且易于使用。我认为它仅适用于32位python,我无法将其安装到64位版本。您也应该安装autoitx3,但我不确定也许它只能使用一个dll。安装autoitx3和pyautoit模块后,您可以使用以下示例代码:

import autoit
import time

time.sleep(2)
#"left" stand for left click, 1243 and 1035 is x and y coordinates and 1 is number of clicks.
autoit.mouse_click("left", 1243, 1035, 1)