我正在编写一些脚本,我需要在VM之上运行这些脚本。我使用的是VMWare工作站15 Pro。我运行的测试脚本是:
def main():
time.sleep(5)
pydirectinput.click()
虚拟机上的单击不注册,而对主机系统的单击则注册。有没有办法让点击注册在VM上,以及如何注册?
发布于 2022-10-18 20:16:37
这可能是不可能实现的,因为即使是在VMWare社区的人也没有任何建议。
虚拟机通常在低于普通程序的级别上与鼠标通信。例如,如果您没有在来宾系统中安装VMWare工具,您就会看到这一点。如果您想使用这样的虚拟机,机器似乎实际上征服了鼠标。你连老鼠都拿不回来。这是因为VMWare或VirtualBox没有正常地使用鼠标。如果您已经安装了VMWare工具,情况仍然是如此。但是对于用户来说,它只是稍微舒服一些。
这种非常特殊的机制可能就是pydirectinput不能将鼠标控件注入虚拟机的原因。众所周知,pydirectinput不适用于所有类型的程序。
通过网络解决方案
有人说过,你需要另一个解决方案。有两个想法。
如果您可以在虚拟机上安装和运行某些东西,那么简单的服务器客户端方法可能会对您有所帮助。在Python中,这非常简单。其想法是将python命令作为字符串直接发送到虚拟机中,并在那里执行它们。
请参阅下面的示例。在虚拟机中,必须运行以下操作:
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这样的方式:
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软件。
https://stackoverflow.com/questions/74070605
复制相似问题