![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Добрый день!
Подскажите пожалуйста как создавать и переключать рабочие столы используя 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;
}; |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
TidusX (16.02.2017)
| ||