Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Иконка в SysTray не создавая своих окон. [D7, WinXP]


Страницы:   1 2 3

Ascan ©   (2005-04-11 14:36:00) 

Если в моей программе Object Pascalнет ниодного окна, то могу ли кинуть иконку в SysTray и обрабатывать по не события?
Иконку кидать получается, но при наведении на нее мышкой иконка пропадает. Возможно, идет проверка на существование окна, описанное при вызове Shell_NotifyIcon...


Piter   (2005-04-13 18:37:00) [21]

mgcr ©   (13.04.05 14:23) [29]
Значение HWND_DESKTOP внутри оконных функций преобразуется к тому же окну, которое возвращается по GetDesktopWindow


есть гарантии, что так и будет в следующих версиях Windows?


jobo   (2005-04-13 18:26:00) [22]

2alpet:
твой вариант действительно самый простой и оптимальный, если всеже нельзя отказаться от иконки в трэе. только скажи как ты экзешник в 9 кб получил? это что на старых версиях делфы или ваще на паскале?


mgcr   (2005-04-13 14:23:00) [23]

Piter ©   (13.04.05 13:54) [28]


> а что же тогда делает GetDesktopWindow?


The GetDesktopWindow function returns a handle to the desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which other windows are painted.

Значение HWND_DESKTOP внутри оконных функций преобразуется к тому же окну, которое возвращается по GetDesktopWindow


Piter   (2005-04-13 13:54:00) [24]

mgcr ©   (13.04.05 12:05) [26]
Он прав. И от системы это не зависит


а что же тогда делает GetDesktopWindow?


alpet   (2005-04-13 12:08:00) [25]

> А копипастнуть AllocateHWnd что мешает?

Эта функция использует CreateWindowEx, RegisterClassEx, и прочие функции для создания обычного окна. Стоит ли изголяться?


mgcr   (2005-04-13 12:05:00) [26]

Piter ©   (13.04.05 11:57) [23]


> Ты не прав. Рабочий стол - это GetDesktopWindow.
>
> Можешь поэкспериментировать на каком-нибудь WinXP


Он прав. И от системы это не зависит.


DiamondShark   (2005-04-13 12:03:00) [27]


> Использование Classes и AllocateHWnd, увеличивает размер
> exe файла до 115кб.

Ай-яй-яй. Какая досада.

А копипастнуть AllocateHWnd что мешает?


alpet   (2005-04-13 11:58:00) [28]

Использование Classes и AllocateHWnd, увеличивает размер exe файла до 115кб.

Вот пример (предельно упрощенный):


program ssmall;
uses Classes, Windows, Types, Messages;
{$R *.res}
type TSimpWnd = class
     procedure         wndProc  (var wMsg: TMessage);
    end;
{ TSimpWnd }

var wnd: Hwnd;
procedure TSimpWnd.wndProc(var wMsg: TMessage);
begin
case wmsg.msg of
 WM_QUIT: DestroyWindow (wnd);
 else
end;
end;
var sob: TSimpWnd;
   msg: tagMSG;
begin
sob := TSimpWnd.Create;
wnd := AllocateHwnd (sob.wndProc);
while (IsWindow (wnd) and GetMessage (msg, wnd, 0, 0)) do
 begin
  TranslateMessage (msg);
  DispatchMessage (msg);
 end;
sob.Free;
end.


Piter   (2005-04-13 11:57:00) [29]

Eraser ©   (11.04.05 15:51) [12]
HWND = 0 - это вполне существующее окно - рабочий стол


Ты не прав. Рабочий стол - это GetDesktopWindow.

Можешь поэкспериментировать на каком-нибудь WinXP


alpet   (2005-04-13 11:50:00) [30]

Сделай простейший ресурс диалога (пустое окно) и для создания окна вызвай CreateDialog.

Пример компилируется в 9Кб exe файл:

program small;
uses windows, types, messages;
{$R *.res}
{$R sm.res} // dialog resource
var hdlg: HWND;

function      DlgFunc (h: HWND;msg: DWORD; wp: WPARAM; lp: LPARAM): DWORD; stdcall;

begin
result := 0;
if (hdlg = 0) then exit; // Error 0
if (h = hdlg) then
 case msg of
  WM_INITDIALOG: {Initialize};
  WM_COMMAND: {OnCommand (wp, lp)};
  WM_CLOSE, WM_QUIT: DestroyWindow (hdlg);
  WM_DESTROY: {};
 end;
end; // DlgFunc

var msg:tagMSG;
begin
hdlg := CreateDialog (HINSTANCE, MAKEINTRESOURCE (1),
                       GetDesktopWindow, @dlgFunc);
if IsWindow (hdlg) then
 begin
  ShowWindow (hdlg, SW_SHOW);
  while (IsWindow (hdlg) and GetMessage (msg, 0, 0, 0)) do
   begin
    TranslateMessage (msg);
    DispatchMessage (msg);  
   end;
 end;
end.


Содержимое .rc файла (компилируется brcc32.exe):

#define IDD_DIALOG1 1
IDD_DIALOG1 DIALOG 0, 0, 71, 32
EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_CONTEXTHELP
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION ""
FONT 8, "MS Sans Serif"
{
}


Digitman   (2005-04-13 11:48:00) [31]


> Не получается правильно описать функцию типа TWndMethod


покажи свой код, описывающий TWndMethod, в "неправильности" которого компилятор якобы упрекает тебя ..


alpet   (2005-04-13 11:33:00) [32]

Если не нравится Forms, создавай окно на API, и соответственно цикл сообщений к нему, в котором можно отлавливать и сообщения от иконки из трея. Размер программы это увеличит на считанные килобайты, если и это много, рекомендую срочно переходить на ассемблер и FASM.


Ascan   (2005-04-13 11:10:00) [33]

Slym, ну вот никак не получается с использованием AllocateHWnd. В чужих примерах я вижу использование этой функции с использованием окон.
Не получается правильно описать функцию типа TWndMethod
Если не трудно, приведи полный пример добавления иконки в Tray с использованием AllocateHWnd.


DiamondShark   (2005-04-13 09:17:00) [34]


> В программе не должно быть ничего лишнего.

99.999% существующих программ прекрасно обходятся без иконки в трее.


Slym   (2005-04-12 11:47:00) [35]

Чем вам AllocateHWnd/DeallocateHWnd из Classes не нравится? Никаких Forms!


Digitman   (2005-04-11 16:04:00) [36]


> собственно пока так у меня и работает


ну так и пусть себе работает !
от добра добра не ищут ..


Ascan   (2005-04-11 16:01:00) [37]

Eraser, (Из раздела потрепаться) "Практически" - не значит "не скажется". Чем больше кода и объектов, тем больше возможных ошибок. Писать надо Оптимально, не надо гоняться за движением "Чем больше программа, тем КРУЧЕ". В программе не должно быть ничего лишнего.
Скоро этот слоган станет моей подписью.

Digitman, собственно пока так у меня и работает...


Digitman   (2005-04-11 15:54:00) [38]


> Ascan   (11.04.05 15:52) [13]
> если нельзя обойтись, то придется создавать
> окно


куда ж деваться с подводной лодки ...
придется !


Ascan   (2005-04-11 15:52:00) [39]

Digitman, а если нельзя обойтись, то придется создавать окно... :-)


Eraser   (2005-04-11 15:51:00) [40]

Ascan

HWND = 0 - это вполне существующее окно - рабочий стол.

Не эффективно, если без этого можно обойтись.
На роизодительность, потребление памяти, и размер EXE это практически не скажется..., так в чём же неэффективность?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо