首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让巨蟒从主机点击到虚拟机中注册

让巨蟒从主机点击到虚拟机中注册
EN

Stack Overflow用户
提问于 2022-10-14 14:14:57
回答 1查看 116关注 0票数 0

我正在编写一些脚本,我需要在VM之上运行这些脚本。我使用的是VMWare工作站15 Pro。我运行的测试脚本是:

代码语言:javascript
运行
复制
def main():
    time.sleep(5)
    pydirectinput.click()

虚拟机上的单击不注册,而对主机系统的单击则注册。有没有办法让点击注册在VM上,以及如何注册?

EN

回答 1

Stack Overflow用户

发布于 2022-10-18 20:16:37

这可能是不可能实现的,因为即使是在VMWare社区的人也没有任何建议。

虚拟机通常在低于普通程序的级别上与鼠标通信。例如,如果您没有在来宾系统中安装VMWare工具,您就会看到这一点。如果您想使用这样的虚拟机,机器似乎实际上征服了鼠标。你连老鼠都拿不回来。这是因为VMWare或VirtualBox没有正常地使用鼠标。如果您已经安装了VMWare工具,情况仍然是如此。但是对于用户来说,它只是稍微舒服一些。

这种非常特殊的机制可能就是pydirectinput不能将鼠标控件注入虚拟机的原因。众所周知,pydirectinput不适用于所有类型的程序。

通过网络解决方案

有人说过,你需要另一个解决方案。有两个想法。

如果您可以在虚拟机上安装和运行某些东西,那么简单的服务器客户端方法可能会对您有所帮助。在Python中,这非常简单。其想法是将python命令作为字符串直接发送到虚拟机中,并在那里执行它们。

请参阅下面的示例。在虚拟机中,必须运行以下操作:

代码语言:javascript
运行
复制
import socket
import pydirectinput

HOST = "127.0.0.1"
PORT = 65433

def vm_exec(command):
    exec(command)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        request_line = "" 
        while True:
            received = conn.recv(1).decode('utf-8')
            if received == ';':
                vm_exec(request_line)
                request_line = ""
            else:
                request_line += received

然后,您可以使用主机上的pydirectinput这样的方式:

代码语言:javascript
运行
复制
import socket

HOST = "127.0.0.1"
PORT = 65433

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

def moveTo(x,y):
    s.sendall(bytes("pydirectinput.moveTo({},{});".format(x,y), 'utf-8'))
def click():
    s.sendall(bytes("pydirectinput.click();", 'utf-8'))

moveTo(100,200)
click()

您必须将IP地址更改为对您有用的内容。地址127.0.0.1肯定没有。这只是为了测试目的。

这个解决方案有一个很大的优点,您不必一直打开虚拟机窗口。你可以把它降到最低,但仍然控制着机器。

当然,如果您使用的IP地址不仅是主机可见的,则此解决方案会造成巨大的安全问题。显然,每个连接到服务器的人都可以执行任意命令。

有为您实现该机制的python库。该函数称为远程方法调用。你会发现很多关于这个的信息。您甚至可以混合编程语言(例如,在客户机上使用Python,在服务器上使用C)。但是,正如我所演示的,这个原则在Python中非常简单(因为Python是一种解释语言),因此实际上不需要额外的库。

远程控制台解决方案

另一种解决方案是使用VMWare的VNC或RDP服务器来控制虚拟机。这不需要在虚拟机上安装额外的软件,也可以在安装来宾操作系统期间工作。使用这种方法,您实际上必须在VNC查看器中打开虚拟机窗口,并在前台显示。但根据你的问题这是你想要的。

在VMWare中,启用此功能的选项是“虚拟机设置”、“->选项”、“-> VNC连接”。然后你可以使用你最喜欢的VNC软件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74070605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档