VBoxManage.exe
是一个 Oracle VirtualBox 配套实用程序,它允许通过命令行控制 VM。它可以执行许多操作,包括启动/停止和屏幕捕获。
我有兴趣,它使用哪个 API?
如果没有这个繁重的命令行实用程序,我如何捕获 VM 屏幕或在那里发送键盘或鼠标命令?哪种语言更好?是否可以使用 Java 访问此 API?
VBoxManage.exe
是一个 Oracle VirtualBox 配套实用程序,它允许通过命令行控制 VM。它可以执行许多操作,包括启动/停止和屏幕捕获。
我有兴趣,它使用哪个 API?
如果没有这个繁重的命令行实用程序,我如何捕获 VM 屏幕或在那里发送键盘或鼠标命令?哪种语言更好?是否可以使用 Java 访问此 API?
使用开源项目的优势之一应该是您可以通过查看源代码来回答此类问题。
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 完成的,您可以查看:
谷歌搜索TakeScreenShotPNGToArray
找到显示界面:
https://www.virtualbox.org/sdkref/interface_i_display.html
从那里你可以找到所有其他东西的列表,比如鼠标和键盘: