![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
Отлично, как минимум мне нужен будет) всё таки лучше чем эту dll таскать с приложением, да и она только для х64 систем.
P.S. Не забудь запатентовать модуль чтоб все знали разработчика в лицо) и реквизиты для благодарности. |
|
#17
|
|||
|
|||
|
Цитата:
В принципе, это указатель на массив. Т.е. должно быть что-то типа Код:
var ppDesktop : array of IObjectArray |
|
#18
|
||||
|
||||
|
В принципе готово. Заморачиваться с IApplicationView я не стал. Остальные методы IVirtualDesktopManagerInternal реализованы.
Код:
{ IVirtualDesktopManager }
const
CLSID_VirtualDesktopManager: TGUID = '{AA509086-5CA9-4C25-8F95-589D3C07B48A}';
IID_VirtualDesktopManager: TGUID = '{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}';
type
IVirtualDesktopManager = interface(IUnknown)
function IsWindowOnCurrentVirtualDesktop(Wnd: HWND; out IsTrue: BOOL): HResult; stdcall;
function GetWindowDesktopId(Wnd: HWND; out DesktopID: TGUID): HResult; stdcall;
function MoveWindowToDesktop(Wnd: HWND; const DesktopID: TGUID): HResult; stdcall;
end;
{ IVirtualDesktopManagerInternal }
const
CLSID_ImmersiveShell: TGUID = '{C2F03A33-21F5-47FA-B4BB-156362A2F239}';
IID_ServiceProvider: TGUID = '{6d5140c1-7436-11ce-8034-00aa006009fa}';
CLSID_VirtualDesktopAPI_Unknown: TGUID = '{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}';
IID_VirtualDesktopManagerInternal: TGUID = '{F31574D6-B682-4CDC-BD56-1827860ABEC6}'; // build 14393 or higher
//IID_VirtualDesktopManagerInternal: TGUID = '{AF8DA486-95BB-4460-B3B7-6E7A6B2962B5}'; // build 10240 or higher
//IID_VirtualDesktopManagerInternal: TGUID = '{EF9F1A6C-D3CC-4358-B712-F84B635BEBE7}'; // build 10130 or higher
IID_VirtualDesktop: TGUID = '{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4}';
type
PIVirtualDesktop = ^IVirtualDesktop;
IVirtualDesktop = interface(IUnknown)
function notimpl(): HRESULT; stdcall; //virtual HRESULT STDMETHODCALLTYPE IsViewVisible(IApplicationView *pView, int *pfVisible) = 0;
function GetId(Id: PGUID): HRESULT; stdcall;
end;
PIObjectArray = ^IObjectArray;
IObjectArray = interface
function GetCount(out Count: UINT): HRESULT; stdcall;
function GetAt(uiIndex: UINT; riid: PGUID; out PIUnknown): HRESULT; stdcall;
end;
IVirtualDesktopManagerInternal = interface(IUnknown)
function GetCount(pCount: PUINT): HRESULT; stdcall;
function notimpl1(): HRESULT; stdcall; //virtual HRESULT STDMETHODCALLTYPE MoveViewToDesktop(IApplicationView *pView,
//VirtualDesktop *pDesktop) = 0;
function notimpl2(): HRESULT; stdcall; //virtual HRESULT STDMETHODCALLTYPE CanViewMoveDesktops(IApplicationView *pView,
//int *pfCanViewMoveDesktops) = 0;
// build 10240 or higher
function GetCurrentDesctop(pVD: PIVirtualDesktop): HRESULT; stdcall;
function GetDesktops(pDesktops: PIObjectArray): HRESULT; stdcall;
function GetAdjacentDesktop(Desktop: IVirtualDesktop; AdjacentDesktop: UINT; pAdjacentDesktop: PIVirtualDesktop): HRESULT; stdcall;
function SwitchDesktop(Desktop: IVirtualDesktop): HRESULT; stdcall;
function CreateDesktopW(pNewDesctop: PIVirtualDesktop): HRESULT; stdcall;
function RemoveDesktop(Desktop: IVirtualDesktop; FallDesktop: IVirtualDesktop): HRESULT; stdcall;
function FindDesktop(Id: PGUID; Desktop: PIVirtualDesktop): HRESULT; stdcall; // build 10240 or higher
end;Ну а на авторство я не претендую, только на порт И достаточно будет того, что на этом форуме отметка с датой публикации есть .Если Админ захочет, то может добавить в исходники. Последний раз редактировалось dr. F.I.N., 17.02.2017 в 15:03. |
|
#19
|
||||
|
||||
|
От скуки реализовал IVirtualDesktopNotification и IVirtualNotificationService, а также набросал простой класс уведомлений.
Архив обновлен. Демка демонстрирует все (почти - IApplicationView так же исключен) возможности нотификации и управления виртуальными рабочими столами. На этом считаю работу законченой. Пользуйте наздоровье. ---------------------------------------------------- Окончательный вариант появился в исходниках Последний раз редактировалось dr. F.I.N., 25.02.2017 в 17:39. |
|
#20
|
|||
|
|||
|
Ты еще вчера опубликовал, а мне не пришло почему то уведомление на почту странно, лан сейчас проверю и отпишу работу.
|
|
#21
|
|||
|
|||
|
Ошибку выдает если нажать на кнопку Current Desktop Id, хотел под отладчиком глянуть место ошибки а твоя демка не хочет под ним у меня запускаться) ну эт мелочи, GUID рабочего стола у меня определялся из другого исходника, а остальное все отлично работает, спасибо большое тебе за проделанную работу, как тебя отблагодарить напиши реквизиты.
|
|
#22
|
|||
|
|||
|
И еще для совместимости, если программу запустят на другой виндоус, в которой нет этой функциональности, то как разумнее сделать?
Код:
initialization if Win32MajorVersion > 9 then begin CoInitialize(nil); DesktopNotification := TVirtualDesktopNotification.Create; DesktopNotification._Register; end; finalization if Win32MajorVersion > 9 then begin DesktopNotification._Unregister; CoUninitialize; end; end. |
|
#23
|
||||
|
||||
|
Да. Про ошибку знаю. Почему-то вылетает AV при голом запуске, но при запуске из под IDE проблем нет. Так что пока не выловил баг (работаю над этим).
А вообще от скуки подпиливаю помаленьку модуль в целом (в том числе и проверка на версию окон). Может в ближайшие дни чего выложу еще. З.Ы. ошибка кстати из-за IVirtualDesktopManager - его функции вообще не работают вне IDE. А IVirtualDesktopmanagerInternal пашет на ура. |
|
#24
|
|||
|
|||
|
Вот в этом месте отладчик делфи выдает ошибку DesktopNotification._Register;
|
|
#25
|
|||
|
|||
|
Вот так вот если сделаешь то нормально отображает GUID текущего рабочего стола.
Код:
function GetWindowsDesktopId(Wnd: HWND): TGUID;
begin
//with GetIVirtualDesktopmanager do
// try
OleCheck(GetIVirtualDesktopmanager.GetWindowDesktopId(Wnd, Result));
// finally
// _Release;
// end;
end;то есть не текущего а на котором находится хендл нужного окна. Последний раз редактировалось TidusX, 18.02.2017 в 15:46. |
|
#26
|
||||
|
||||
|
Известные на этот момент ошибки я поотлавливал (некорректно работал с интерфейсами в некоторых местах). Сейчас привожу в божеский вид класс.
Изначально суть была в том, чтоб просто проверить работу интерфейсов, поэтому демка была написана на скоряк. Хотя даже не так. Изначально была попытка помочь ответить тебе на твой вопрос. А потом любопытство взяло вверх. Интересные задачи здесь не так часто попадаются. Ну а коли взялся, то надо доводить до ума. Либо компонентом сделаю, либо оставлю классом и после тщательных тестов отправлю полноценное демо в "исходники". Учитывая что информации об этом мало, а на Delphi вообще нет (или тщательно скрыта). Последний раз редактировалось dr. F.I.N., 18.02.2017 в 16:19. |
|
#27
|
|||
|
|||
|
Да на делфи глушь на эту тему по всему инету, особенно с новым интерфейсом где переключаться можно между рабочими столами, на том же форуме embarcadero там не так давно задавался вопрос только по классу ivirtualdesktopmanager, проблемку решали почему IsWindowOnCurrentVirtualDesktop всегда возвращает истину.
|
|
#28
|
||||
|
||||
|
Цитата:
![]() |
|
#29
|
|||
|
|||
|
|
|
#30
|
||||
|
||||
|
Подытожу. Реализованы интерфейсы:
IVirtualDesktopManager (Полностью) IVirtualDesktopManagerInternal (Полностью) IVirtualDesktop (Полностью) IVirtualDesktopNotification (Полностью) IVirtualNotificationService (Полностью) IVirtualDesktopPinnedApps (Полностью) IApplicationViewCollection (Частично) IApplicationView (Частично) Окончательный вариант появился в исходниках. |