我希望让所有Windows操作系统都能在Virtual Box中运行。 我想从主机Windows(主窗口)发送密钥到访客Windows的记事本。 我知道我们可以通过 delphi 中的 EnumChildWindows 找到子窗口,但Virtual Box只能检索 QWidget 类名。 谁能帮助我使用 delphi 从主窗口访问Guest Windows的所有句柄(在Virtual Box中运行)? 谢谢。
答案 0 :(得分:3)
我希望Windows的所有子项都能在Virtual Box中运行。
抱歉,但你做不到。就像AlexK在评论中所说,在客户操作系统中运行的窗口在主机操作系统中根本不存在,因此在主机操作系统中运行的应用程序无法访问或枚举它们。 VM正在运行一个完全独立的客户操作系统,只是在主机操作系统上运行的自己的窗口上呈现该操作系统的显示输出。
我想从主机Windows(主窗口)向Guest Windows的记事本发送密钥。
没有办法直接。
当用户在主机OS中的物理键盘或屏幕键盘上键入键时,该键被放入主机OS的输入队列中并被路由到主机OS内的当前聚焦窗口。如果该窗口恰好是VM,则VM将密钥放在来宾操作系统的输入队列中,并将其路由到来宾操作系统中的当前焦点窗口。
在主机操作系统上运行的应用程序可以使用SendInput()
来模拟主机操作系统中的键盘输入,并让它相应地进行路由。
如果您需要更多控制权,则必须在客户操作系统中运行单独的应用程序,该应用程序连接到在主机操作系统上运行的主应用程序。然后,主机应用程序可以与来宾应用程序通信,并且来宾应用程序可以根据需要对来宾窗口进行操作。
例如,主机应用可以要求访客应用程序枚举访客窗口并将该列表发送回主机应用程序。主机应用程序可以检测到记事本的存在,并将所需的密钥发送到访客应用程序,然后可以将密钥发送到记事本窗口。
我知道我们可以通过在delphi中使用EnumChildWindows找到子窗口
仅适用于在运行枚举应用程序的同一操作系统中运行的Windows。
但Virtual Box只检索QWidget类名。
因为那是在主机操作系统中运行的窗口。