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

Delphi Sources



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

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

Добрый день!

Подскажите пожалуйста как создавать и переключать рабочие столы используя Win10 API
Ответить с цитированием
  #2  
Старый 15.02.2017, 20:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

а что, в гугле забанили.
На запрос он даже сам дает маленькую табличку с описанием:
Цитата:
Сообщение от google
How to create a new virtual desktop in Windows 10
Click the Task View button in your taskbar. It looks like a square over a rectangle. You can also simultaneously hit the Windows key and Tab key together on your keyboard.
Click New Desktop. It's located in the bottom right corner of your screen.
Ответить с цитированием
  #3  
Старый 15.02.2017, 20:32
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

lmikle, я облазил весь инет перед тем как задавать вопрос, вы мне скопипастили текст на английском, хотя такого текста полно и на русском как это делать ручками, я ж спрашиваю использую WINAPI значит программно, например пользователь поместил мою программу на второй рабочий стол, потом ушел на первый рабочий стол, программа как завершила свои действия программно выполнит переход на тот рабочий стол где она находится, чтоб пользователь сразу увидел, да много для чего это нужно, если пользуешься virtualbox`ом то там давно реализована такая функция перехода на тот рабочий стол где выполнятся виртуальная машина.
Ответить с цитированием
  #4  
Старый 15.02.2017, 21:29
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Кажись не весь облазил еще) нашел на забугорном форуме http://stackoverflow.com/questions/4...ager-in-delphi
Просто нужно было гуглить IVirtualDesktop и IVirtualDesktopManager, а на русском гуглил гуглил и ниче нужного не на гуглил, над исправлять это дело)
Ответить с цитированием
  #5  
Старый 16.02.2017, 02:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нельзя так делать. Мало ли чем пользователь в это время занят.
Вставляй сообщение в Message Center.
Ответить с цитированием
  #6  
Старый 16.02.2017, 10:52
TidusX TidusX вне форума
Прохожий
 
Регистрация: 20.10.2013
Сообщения: 19
Версия Delphi: XE10.2 Tokyo
Репутация: 10
По умолчанию

Да об этом можно много рассуждать, кого-то это может раздражать когда чужая программа поверх сама внезапно становится, кого-то наоборот радовать что сразу перед их глазами и они сразу видят что нужно в ней сделать, а не нужно вчитываться в эти сообщения, конечно по всякой фигне отвлекать пользователя таким образом не собираюсь, да и опция будет как уведомлять.
Теперь давайте по теме) на том форуме я нашел рабочий код
Код:
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.
Там всего три функции IsOnCurrentDesktop(wnd: HWND): Boolean; эта чтобы проверить хэндл окна находится ли он на текущем рабочем столе, GetWindowDesktopId(Wnd: HWND): TGUID; эта возращает TGUID рабочего стола хендл окна которого хотим проверить, и этой MoveWindowToDesktop(Wnd: HWND; const DesktopID: TGUID) можно отправить наше окно на нужный рабочий стол.
А как программно перейти к нужному рабочему? Вот я получил TGUID рабочего стола на котором находится моя программа, пользователь сидит на первом рабочем столе и что нужно выполнить чтобы произошел переход к рабочему столу где находится моя программа? Читал что нужный рабочий стол автоматически активируется если передать фокус программе, но уже перепробовал разные функции для передачи фокуса программе, единственно
Код:
SetForegroundWindow(application.MainFormHandle);
дает признаки, иконка программы начинает мигать на панели задач, когда по ней кликнешь то сразу выполняется переход на тот рабочий стол, но хотелось бы это все программно, VirtualBox умеет переходить к нужному рабочему столу где работает его виртуальная машина как он так замутил, или хитрым способом программно клацает горячую клавишу CTRL+WIN+стрелка влево/вправо для перехода на нужный рабочий стол, но для этого нужно знать тогда текущую позицию рабочего стола и отсчитывать кол-во нажатий до позицию нужного рабочего стола.
Ответить с цитированием
  #7  
Старый 16.02.2017, 11:35
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Попробуй через другой интерфейс 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)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter