Иконка  на  Tray'е    это   просто   картинка,   а   не  окно  какой-либо   программы  (исследование  системы  с  помощью Microsoft Spy++ for  Windows   показывает,  что  это  не окно вообще).  System Tray  отслеживает  события  мыши  над  иконкой и, в случае  надобности, показывает  ToolTip для этой иконки. Так же он отсылает сообщения о  всех действиях мыши над иконкой окну, которое поместило иконку на Tray. Таким  образом,  нельзя  поместить  программу  на  Tray.  Любая  программа  может  добавить  столько  иконок  на  Tray,  сколько ей  необходимо.  При  этом главное окно программы не обязано исчезать  или  минимизироватся  - примером может служить Microsoft Internet  Mail,  помещающая  иконку  " конверт"   на  Tray в случае появления  новых писем.

Эта программа добавляет файл "File.txt" в "Пуск/Документы".

Code:

uses ShlOBJ;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

SHAddToRecentDocs(SHARD_PATH, PChar('File.txt'));

end;

 

 Автор советов: Даниил Карапетян

e-mail: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

 

Автор справки: Алексей Денисов

e-mail: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

 

 

Если вы не хотите, чтобы ваше приложение имело иконку в панели задач, добавьте следующие строки в исходный код проекта:

 

Code:

Application.CreateHandle;

ShowWindow(Application.Handle, SW_HIDE);

Application.ShowMainForm := FALSE;

 

Вызовите Windows API функцию SHAddToRecentDocs() передав nil вместо имени файла в качестве параметра.

 

Code:

procedure WMQueryOpen(var Msg: TWMQueryOpen);

message WM_QUERYOPEN;

 

// ... и ее реализация

procedure TMainForm.WMQueryOpen(var Msg: TWMQueryOpen);

begin

Msg.Result := 0;

end;

 

 

 Я хочу представить простой мульти-экран эмулятор, написанный на Delphi.

Он состоит в небольшой форме размещения в правом нижнем углу экрана, прямо над треем, которая состоит из 5 кнопок.

В начале первая кнопка вниз; затем, когда я нажимаю другую кнопку,  открывается новый рабочий стол. В этом новом рабочем столе я могу открыть другие программы

и так далее с другими кнопками. Когда я вернусь к одной из кнопок,  Я буду видеть только программы, открытые в этом контексте, без других.

Фокус состоит в том, чтобы сделать следующие шаги непосредственно перед нажатием другой кнопки:

 

 

 

Дело-то вот в чем: Главным окном программы дельфийской является не главная форма, а окно TApplication, которое имеет нулевые размеры, поэтому его не видно. Именно для него показывается иконка на панели задач. Когда пользователь нажимает кнопку минимизации на главной форме, команда минимизации передается этому окну, и сворачивается именно оно, а для остальных просто делается hide. А так как окно TApplication имеет нулевые размеры, то и анимации никакой не видно.

Добавить новый пункт меню в системное меню диалога:

Code:

AppendMenu(GetSystemMenu(Self.Handle,FALSE),MF_ENABLED,1001,'&Help');

 Автор ответа: Sheff

 

Code:

procedure TMyForm.CreateParams(var Params :TCreateParams); {override;}

begin

inherited CreateParams(Params); {CreateWindowEx}

Params.ExStyle := Params.ExStyle or WS_Ex_AppWindow;

end;

 

 

 

Code:

program proga2;

 

uses

Windows;

 

var

Wnd: THandle; { объявляем переменные }

int: integer;

 

begin

Randomize; { холостой прогон генератора случайных чисел }

int := Random(3); { выбор одного варианта из четырёх }

case int of

   0: { если первый вариант то }

   begin

     Wnd := FindWindow('Progman', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'ShellDll_DefView', nil);

     { прячем трей }

     ShowWindow(Wnd, sw_hide);

   end;

   1: { если второй вариант то }

   begin

     Wnd := FindWindow('Shell_TrayWnd', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'TrayClockWClass', nil);

     { прячем часы }

     ShowWindow(Wnd, sw_hide);

   end;

   2:

   begin

     Wnd := FindWindow('Shell_TrayWnd', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'Button', nil);

     {прячем кнопку "Пуск"}

     ShowWindow(Wnd, sw_hide);

end;

3:

begin

   Wnd := FindWindow('Shell_TrayWnd', nil);

   Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);

   { прячем "Панель задач" }

   ShowWindow(Wnd, sw_hide);

end;

end;

 

end.

 

 

Code:

uses CommCtrl;

{©Drkb v.3}

 

function GetModuleFileNameExW(hProcess:THandle; hModule:HMODULE; lpFilename:PWideChar; nSize:DWORD):DWORD; stdcall; external 'PSAPI.DLL';

 

const

ICON_SMALL2 = 2;

 

function WindowGetEXE(wnd:HWND):string;

var

wt:array[0..MAX_PATH-1] of WChar;

r:integer;

prc:THandle;

prcID:cardinal;

begin

result:='';

if GetWindowThreadProcessID(wnd,prcID)<>0 then

begin

prc:=OpenProcess(PROCESS_ALL_ACCESS,false,prcID);

if prc<>0 then

try

   r:=GetModuleFileNameExW(prc,0,wt,MAX_PATH*2);

  if r<>0 then result:=wt;

finally

  CloseHandle(prc)

end

end

end;

 

function WindowGetIcon(wnd:HWND; fSmall:boolean):Cardinal;

var

defIcon:HICON;

r,iType1,iType2: integer;

begin

   defIcon:=LoadIcon(0,IDI_APPLICATION);

   if fSmall then

   begin iType1:=ICON_SMALL2; iType2:= GCL_HICONSM; end else

   begin iType1:=ICON_BIG; iType2:= GCL_HICON; end;

 

  r:=SendMessageTimeOut(wnd,WM_GETICON,iType1,0,SMTO_ABORTIFHUNG or SMTO_NOTIMEOUTIFNOTHUNG, 100, result);

  if (r=0) then result:=defIcon else

  begin

   if (result=0) then result:=GetClassLong(wnd,iType2);

   if (result=0) then result:=defIcon

  end;

end;

 

function EnumWindowsProc(wnd:HWND; lParam: LPARAM):BOOL; stdcall;

var

wn:array[0..MAX_PATH-1] of char;

begin

result:=true;

if IsWindowVisible(wnd) and (GetParent(wnd)=0) and (GetWindow(wnd,GW_OWNER)=0) and

((GetWindowLong(wnd,GWL_EXSTYLE) and WS_EX_TOOLWINDOW)=0then

begin

GetWindowText(wnd,wn,MAX_PATH);

with Form1.ListView1.Items.Add do

begin

   Caption :=wn; // заголовок

   SubItems.Add(IntToStr(wnd)); // дескриптор

   SubItems.Add(WindowGetEXE(wnd)); // exe

   SubItems.Add(' '); // колонка для большой иконки

   ImageIndex:=ImageList_AddIcon(Form1.ImageList1.Handle,WindowGetIcon(wnd,true)); // маленькая иконка

   SubItemImages[2] := ImageList_AddIcon(Form1.ImageList2.Handle,WindowGetIcon(wnd,false)); // большая иконка

end;

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ListView1.Clear;

ImageList1.Clear;

ImageList2.Clear;

EnumWindows(@EnumWindowsProc,0);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

// ImageList1 - 16x16;  ImageList2 - 32x32;

ListView1.SmallImages:=ImageList1;

ListView1.LargeImages:=ImageList2;

end;