|
|
Регистрация | << Правила форума >> | 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; Ну а на авторство я не претендую, только на порт И достаточно будет того, что на этом форуме отметка с датой публикации есть . Если Админ захочет, то может добавить в исходники. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 17.02.2017 в 15:03. |
#19
|
||||
|
||||
От скуки реализовал IVirtualDesktopNotification и IVirtualNotificationService, а также набросал простой класс уведомлений.
Архив обновлен. Демка демонстрирует все (почти - IApplicationView так же исключен) возможности нотификации и управления виртуальными рабочими столами. На этом считаю работу законченой. Пользуйте наздоровье. ---------------------------------------------------- Окончательный вариант появился в исходниках Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось 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 пашет на ура. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#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 вообще нет (или тщательно скрыта). Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 18.02.2017 в 16:19. |
#27
|
|||
|
|||
Да на делфи глушь на эту тему по всему инету, особенно с новым интерфейсом где переключаться можно между рабочими столами, на том же форуме embarcadero там не так давно задавался вопрос только по классу ivirtualdesktopmanager, проблемку решали почему IsWindowOnCurrentVirtualDesktop всегда возвращает истину.
|
#28
|
||||
|
||||
Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#29
|
|||
|
|||
|
#30
|
||||
|
||||
Подытожу. Реализованы интерфейсы:
IVirtualDesktopManager (Полностью) IVirtualDesktopManagerInternal (Полностью) IVirtualDesktop (Полностью) IVirtualDesktopNotification (Полностью) IVirtualNotificationService (Полностью) IVirtualDesktopPinnedApps (Полностью) IApplicationViewCollection (Частично) IApplicationView (Частично) Окончательный вариант появился в исходниках. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |