|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Win10 переход на нужный рабочий стол
Добрый день!
Подскажите пожалуйста как создавать и переключать рабочие столы используя Win10 API |
#2
|
|||
|
|||
а что, в гугле забанили.
На запрос он даже сам дает маленькую табличку с описанием: Цитата:
|
#3
|
|||
|
|||
lmikle, я облазил весь инет перед тем как задавать вопрос, вы мне скопипастили текст на английском, хотя такого текста полно и на русском как это делать ручками, я ж спрашиваю использую WINAPI значит программно, например пользователь поместил мою программу на второй рабочий стол, потом ушел на первый рабочий стол, программа как завершила свои действия программно выполнит переход на тот рабочий стол где она находится, чтоб пользователь сразу увидел, да много для чего это нужно, если пользуешься virtualbox`ом то там давно реализована такая функция перехода на тот рабочий стол где выполнятся виртуальная машина.
|
#4
|
|||
|
|||
Кажись не весь облазил еще) нашел на забугорном форуме http://stackoverflow.com/questions/4...ager-in-delphi
Просто нужно было гуглить IVirtualDesktop и IVirtualDesktopManager, а на русском гуглил гуглил и ниче нужного не на гуглил, над исправлять это дело) |
#5
|
|||
|
|||
Нельзя так делать. Мало ли чем пользователь в это время занят.
Вставляй сообщение в Message Center. |
#6
|
|||
|
|||
Да об этом можно много рассуждать, кого-то это может раздражать когда чужая программа поверх сама внезапно становится, кого-то наоборот радовать что сразу перед их глазами и они сразу видят что нужно в ней сделать, а не нужно вчитываться в эти сообщения, конечно по всякой фигне отвлекать пользователя таким образом не собираюсь, да и опция будет как уведомлять.
Теперь давайте по теме) на том форуме я нашел рабочий код Код:
unit VDMUnit; interface uses Windows; function IsOnCurrentDesktop(wnd: HWND): Boolean; function GetWindowDesktopId(Wnd: HWND): TGUID; procedure MoveWindowToDesktop(Wnd: HWND; const DesktopID: TGUID); implementation uses ActiveX, Comobj; const IID_VDM: TGUID = '{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}'; CLSID_VDM: TGUID ='{AA509086-5CA9-4C25-8F95-589D3C07B48A}'; type IVirtualDesktopManager = interface(IUnknown) ['{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}'] 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; function GetVDM: IVirtualDesktopManager; begin Result := nil; OleCheck(CoCreateInstance(CLSID_VDM, nil, CLSCTX_INPROC_SERVER, IVirtualDesktopManager, Result)); end; function IsOnCurrentDesktop(wnd: HWND): Boolean; var value: BOOL; begin OleCheck(GetVDM.IsWindowOnCurrentVirtualDesktop(Wnd, value)); Result := value; end; function GetWindowDesktopId(Wnd: HWND): TGUID; being OleCheck(GetVDM.GetWindowDesktopId(Wnd, Result)); end; procedure MoveWindowToDesktop(Wnd: HWND; const DesktopID: TGUID); begin OleCheck(GetVDM.MoveWindowToDesktop(Wnd, DesktopID)); end; end. А как программно перейти к нужному рабочему? Вот я получил TGUID рабочего стола на котором находится моя программа, пользователь сидит на первом рабочем столе и что нужно выполнить чтобы произошел переход к рабочему столу где находится моя программа? Читал что нужный рабочий стол автоматически активируется если передать фокус программе, но уже перепробовал разные функции для передачи фокуса программе, единственно Код:
SetForegroundWindow(application.MainFormHandle); |
#7
|
||||
|
||||
Попробуй через другой интерфейс GitHub
(SwitchDesktop) Код:
MIDL_INTERFACE("f31574d6-b682-4cdc-bd56-1827860abec6") IVirtualDesktopManagerInternal : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetCount( UINT *pCount) = 0; virtual HRESULT STDMETHODCALLTYPE MoveViewToDesktop( IApplicationView *pView, IVirtualDesktop *pDesktop) = 0; // Since build 10240 virtual HRESULT STDMETHODCALLTYPE CanViewMoveDesktops( IApplicationView *pView, int *pfCanViewMoveDesktops) = 0; virtual HRESULT STDMETHODCALLTYPE GetCurrentDesktop( IVirtualDesktop** desktop) = 0; virtual HRESULT STDMETHODCALLTYPE GetDesktops( IObjectArray **ppDesktops) = 0; virtual HRESULT STDMETHODCALLTYPE GetAdjacentDesktop( IVirtualDesktop *pDesktopReference, AdjacentDesktop uDirection, IVirtualDesktop **ppAdjacentDesktop) = 0; virtual HRESULT STDMETHODCALLTYPE SwitchDesktop( IVirtualDesktop *pDesktop) = 0; virtual HRESULT STDMETHODCALLTYPE CreateDesktopW( IVirtualDesktop **ppNewDesktop) = 0; virtual HRESULT STDMETHODCALLTYPE RemoveDesktop( IVirtualDesktop *pRemove, IVirtualDesktop *pFallbackDesktop) = 0; // Since build 10240 virtual HRESULT STDMETHODCALLTYPE FindDesktop( GUID *desktopId, IVirtualDesktop **ppDesktop) = 0; }; // aa509086-5ca9-4c25-8f95-589d3c07b48a ? MIDL_INTERFACE("a5cd92ff-29be-454c-8d04-d82879fb3f1b") IVirtualDesktopManager : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop( /* [in] */ __RPC__in HWND topLevelWindow, /* [out] */ __RPC__out BOOL *onCurrentDesktop) = 0; virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId( /* [in] */ __RPC__in HWND topLevelWindow, /* [out] */ __RPC__out GUID *desktopId) = 0; virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop( /* [in] */ __RPC__in HWND topLevelWindow, /* [in] */ __RPC__in REFGUID desktopId) = 0; }; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
TidusX (16.02.2017)
|