Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 16.02.2017, 20:44
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Отлично, как минимум мне нужен будет) всё таки лучше чем эту dll таскать с приложением, да и она только для х64 систем.
P.S. Не забудь запатентовать модуль чтоб все знали разработчика в лицо) и реквизиты для благодарности.
Ответить с цитированием
  #17  
Старый 16.02.2017, 22:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
В принципе не особо сложного было перевести. Однако пои познания в С настолько скудны, что я не смог перевести в Delphi
Код:
virtual HRESULT STDMETHODCALLTYPE GetDesktops(
IObjectArray **ppDesktops) = 0;
Не могу допетрить как извратиться с **ppDesktop (указатель на указатель).
Так что если спецы подскажут, буду премного благодарен.

В принципе, это указатель на массив.
Т.е. должно быть что-то типа
Код:
var ppDesktop : array of IObjectArray
хотя странно, там ведь интерфейс уже массив описывает...
Ответить с цитированием
  #18  
Старый 17.02.2017, 08:37
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

В принципе готово. Заморачиваться с 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.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо dr. F.I.N. за это полезное сообщение:
Alegun (17.02.2017), TidusX (18.02.2017)
  #19  
Старый 17.02.2017, 15:06
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

От скуки реализовал IVirtualDesktopNotification и IVirtualNotificationService, а также набросал простой класс уведомлений.
Архив обновлен. Демка демонстрирует все (почти - IApplicationView так же исключен) возможности нотификации и управления виртуальными рабочими столами.
На этом считаю работу законченой. Пользуйте наздоровье.


----------------------------------------------------
Окончательный вариант появился в исходниках
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.

Последний раз редактировалось dr. F.I.N., 25.02.2017 в 17:39.
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dr. F.I.N. за это полезное сообщение:
Admin (17.02.2017), Alegun (17.02.2017), lmikle (17.02.2017), TidusX (18.02.2017)
  #20  
Старый 18.02.2017, 14:05
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Ты еще вчера опубликовал, а мне не пришло почему то уведомление на почту странно, лан сейчас проверю и отпишу работу.
Ответить с цитированием
  #21  
Старый 18.02.2017, 14:22
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Ошибку выдает если нажать на кнопку Current Desktop Id, хотел под отладчиком глянуть место ошибки а твоя демка не хочет под ним у меня запускаться) ну эт мелочи, GUID рабочего стола у меня определялся из другого исходника, а остальное все отлично работает, спасибо большое тебе за проделанную работу, как тебя отблагодарить напиши реквизиты.
Ответить с цитированием
  #22  
Старый 18.02.2017, 14:47
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

И еще для совместимости, если программу запустят на другой виндоус, в которой нет этой функциональности, то как разумнее сделать?
Код:
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  
Старый 18.02.2017, 15:01
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Да. Про ошибку знаю. Почему-то вылетает AV при голом запуске, но при запуске из под IDE проблем нет. Так что пока не выловил баг (работаю над этим).
А вообще от скуки подпиливаю помаленьку модуль в целом (в том числе и проверка на версию окон). Может в ближайшие дни чего выложу еще.

З.Ы. ошибка кстати из-за IVirtualDesktopManager - его функции вообще не работают вне IDE. А IVirtualDesktopmanagerInternal пашет на ура.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #24  
Старый 18.02.2017, 15:03
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Вот в этом месте отладчик делфи выдает ошибку DesktopNotification._Register;
Ответить с цитированием
  #25  
Старый 18.02.2017, 15:43
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Вот так вот если сделаешь то нормально отображает 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  
Старый 18.02.2017, 16:07
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Известные на этот момент ошибки я поотлавливал (некорректно работал с интерфейсами в некоторых местах). Сейчас привожу в божеский вид класс.
Изначально суть была в том, чтоб просто проверить работу интерфейсов, поэтому демка была написана на скоряк. Хотя даже не так. Изначально была попытка помочь ответить тебе на твой вопрос. А потом любопытство взяло вверх. Интересные задачи здесь не так часто попадаются.
Ну а коли взялся, то надо доводить до ума. Либо компонентом сделаю, либо оставлю классом и после тщательных тестов отправлю полноценное демо в "исходники". Учитывая что информации об этом мало, а на Delphi вообще нет (или тщательно скрыта).
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.

Последний раз редактировалось dr. F.I.N., 18.02.2017 в 16:19.
Ответить с цитированием
  #27  
Старый 18.02.2017, 16:36
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Да на делфи глушь на эту тему по всему инету, особенно с новым интерфейсом где переключаться можно между рабочими столами, на том же форуме embarcadero там не так давно задавался вопрос только по классу ivirtualdesktopmanager, проблемку решали почему IsWindowOnCurrentVirtualDesktop всегда возвращает истину.
Ответить с цитированием
  #28  
Старый 18.02.2017, 16:38
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от TidusX
Да на делфи глушь на эту тему по всему инету, особенно с новым интерфейсом где переключаться можно между рабочими столами, на том же форуме embarcadero там не так давно задавался вопрос только по классу ivirtualdesktopmanager, проблемку решали почему IsWindowOnCurrentVirtualDesktop всегда возвращает истину.
Если ссылочка недалеко на эмбаркадеру, скинь пожалуйста. Глянуть на всякий случай. Авось что полезное увижу, какие грабли могут подстерегать
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #29  
Старый 18.02.2017, 16:39
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

https://forums.embarcadero.com/threa...46003&tstart=0
Ответить с цитированием
  #30  
Старый 25.02.2017, 17:46
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Подытожу. Реализованы интерфейсы:
IVirtualDesktopManager (Полностью)
IVirtualDesktopManagerInternal (Полностью)
IVirtualDesktop (Полностью)
IVirtualDesktopNotification (Полностью)
IVirtualNotificationService (Полностью)
IVirtualDesktopPinnedApps (Полностью)
IApplicationViewCollection (Частично)
IApplicationView (Частично)

Окончательный вариант появился в исходниках.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter