Да об этом можно много рассуждать, кого-то это может раздражать когда чужая программа поверх сама внезапно становится, кого-то наоборот радовать что сразу перед их глазами и они сразу видят что нужно в ней сделать, а не нужно вчитываться в эти сообщения, конечно по всякой фигне отвлекать пользователя таким образом не собираюсь, да и опция будет как уведомлять.
Теперь давайте по теме) на том форуме я нашел рабочий код
Код:
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+стрелка влево/вправо для перехода на нужный рабочий стол, но для этого нужно знать тогда текущую позицию рабочего стола и отсчитывать кол-во нажатий до позицию нужного рабочего стола.