【发布时间】:2012-11-30 16:49:56
【问题描述】:
VBoxManage.exe 是一个 Oracle VirtualBox 配套实用程序,它允许通过命令行控制虚拟机。它可以执行多种操作,包括启动/停止和屏幕捕获。
我有兴趣,它使用哪个 API?
如何在没有这个繁重的命令行实用程序的情况下捕获 VM 屏幕或在那里发送键盘或鼠标命令?哪种语言更好?是否可以使用 Java 访问此 API?
【问题讨论】:
标签: c# java api virtualbox
VBoxManage.exe 是一个 Oracle VirtualBox 配套实用程序,它允许通过命令行控制虚拟机。它可以执行多种操作,包括启动/停止和屏幕捕获。
我有兴趣,它使用哪个 API?
如何在没有这个繁重的命令行实用程序的情况下捕获 VM 屏幕或在那里发送键盘或鼠标命令?哪种语言更好?是否可以使用 Java 访问此 API?
【问题讨论】:
标签: c# java api virtualbox
使用开源项目的优点之一应该是您可以通过查看源代码来回答此类问题。
VBoxManage 位于/src/VBox/Frontends/VBoxManage 下的源存储库中。您要查找的代码在VBoxManageControlVM.cpp 中,条件为if (!strcmp(a->argv[1], "screenshotpng")):
ComPtr<IDisplay> pDisplay;
CHECK_ERROR_BREAK(console, COMGETTER(Display)(pDisplay.asOutParam()));
ULONG width, height, bpp;
CHECK_ERROR_BREAK(pDisplay,
GetScreenResolution(displayIdx, &width, &height, &bpp));
com::SafeArray<BYTE> saScreenshot;
CHECK_ERROR_BREAK(pDisplay, TakeScreenShotPNGToArray(displayIdx,
width, height, ComSafeArrayAsOutParam(saScreenshot)));
RTFILE pngFile = NIL_RTFILE;
vrc = RTFileOpen(&pngFile, a->argv[2], RTFILE_O_OPEN_CREATE | RTFILE_O_WRITE |
RTFILE_O_TRUNCATE | RTFILE_O_DENY_ALL);
if (RT_FAILURE(vrc))
{
RTMsgError("Failed to create file '%s'. rc=%Rrc", a->argv[2], vrc);
rc = E_FAIL;
break;
}
vrc = RTFileWrite(pngFile, saScreenshot.raw(), saScreenshot.size(), NULL);
if (RT_FAILURE(vrc))
{
RTMsgError("Failed to write screenshot to file '%s'. rc=%Rrc",
a->argv[2], vrc);
rc = E_FAIL;
}
RTFileClose(pngFile);
所以它是通过 COM API 完成的,你可以看看:
Is it possible to call a COM API from Java?
搜索TakeScreenShotPNGToArray 找到显示界面:
https://www.virtualbox.org/sdkref/interface_i_display.html
从那里你可以找到所有其他东西的列表,比如鼠标和键盘:
【讨论】: