2012-11-30 17 views
0

VBoxManage.exe是Oracle VirtualBox伴侶工具,它允許通過命令行控制VM。它可以執行許多操作,包括啓動/停止和屏幕捕獲。VBoxManage.exe使用什麼API?

我很感興趣,它使用哪個API?

如何在沒有這個沉重的命令行工具的情況下捕獲VM屏幕或發送鍵盤或鼠標命令?哪種語言更好?用Java可以訪問這個API嗎?

回答

3

使用開源項目的優點之一應該是您可以通過查看源代碼來回答這些問題。

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

從那裏你可以找到的所有其他像鼠標和鍵盤列表:

https://www.virtualbox.org/sdkref/annotated.html

+1

我不知道這是開源:恥辱: – Dims