В принципе не особо сложного было перевести. Однако пои познания в С настолько скудны, что я не смог перевести в Delphi
Код:
virtual HRESULT STDMETHODCALLTYPE GetDesktops(
IObjectArray **ppDesktops) = 0;
Не могу допетрить как извратиться с **ppDesktop (указатель на указатель).
Так что если спецы подскажут, буду премного благодарен.
А так, вот функция выводит количество виртуальных десктопов. Остается только перевести остальные ф-ции и задача решена.
Код:
unit uVDMI;
interface
uses
Windows, ActiveX, Comobj;
const
CLSID_ImmersiveShell: TGUID = '{C2F03A33-21F5-47FA-B4BB-156362A2F239}';
CLSID_VDMI: TGUID = '{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}';
// 10130 // 10240 // 14393
IID_IVDMI_ARRAY: array [0..2] of TGUID = ('{EF9F1A6C-D3CC-4358-B712-F84B635BEBE7}', '{AF8DA486-95BB-4460-B3B7-6E7A6B2962B5}', '{F31574D6-B682-4CDC-BD56-1827860ABEC6}');
type
IVirtualDesktopManagerInternal = interface(IUnknown)
// ['{F31574D6-B682-4CDC-BD56-1827860ABEC6}']
function GetCount(Count: PUINT): HRESULT; stdcall;
function notimpl1(): HRESULT; stdcall;
function notimpl2(): HRESULT; stdcall;
function notimpl3(): HRESULT; stdcall;
function notimpl4(): HRESULT; stdcall;
function notimpl5(): HRESULT; stdcall;
function notimpl6(): HRESULT; stdcall;
function notimpl7(): HRESULT; stdcall;
function notimpl8(): HRESULT; stdcall;
function notimpl9(): HRESULT; stdcall;
end;
function GetDesktopCount: Cardinal;
implementation
function GetDesktopCount: Cardinal;
var
shell: IServiceProvider;
VDMI: IVirtualDesktopManagerInternal;
i: Integer;
begin
Result := 0;
if Succeeded(CoCreateInstance(CLSID_ImmersiveShell, nil, CLSCTX_LOCAL_SERVER, IServiceProvider, shell)) then
begin
for i := Low(IID_IVDMI_ARRAY) to High(IID_IVDMI_ARRAY) do
if Succeeded(shell.QueryService(CLSID_VDMI, IID_IVDMI_ARRAY[i], VDMI)) then
begin
VDMI.GetCount(@Result);
VDMI._Release;
Break;
end;
shell._Release;
end;
end;
end.