Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Иконка в SysTray не создавая своих окон.   Найти похожие ветки 

 
Ascan   (2005-04-11 14:36) [0]

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


 
Digitman ©   (2005-04-11 14:42) [1]


> Если в моей программе Object Pascal нет ниодного окна, то
> могу ли кинуть иконку в SysTray и обрабатывать по не события?


обработкой событий иконки занимается оконная ф-ция некоего окна
нет окна - нет и обработки


 
Eraser ©   (2005-04-11 14:50) [2]

Ascan

Попробуй создать отдельный поток и там перехватывать нужные сообщения ф-ей Get/PeekMessage.


 
Digitman ©   (2005-04-11 15:00) [3]


> Eraser ©   (11.04.05 14:50) [2]


а можно еще попробовать хуков всяко-разных понаставить ... можно драйвер написать ... мно-о-ого еще чего можно попробовать !

но проще почитать справку :

typedef struct _NOTIFYICONDATA { // nid  
   DWORD cbSize;
   HWND hWnd;
   UINT uID;
   UINT uFlags;
   UINT uCallbackMessage;
   HICON hIcon;
   char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;


Members

...

hWnd

Handle of the window that receives notification messages associated with an icon in the taskbar status area.


 
Eraser ©   (2005-04-11 15:15) [4]

Digitman ©
HWND hWnd;


Ферштейн.

Ascan

Модуль Forms есть в uses"e?


 
Eraser ©   (2005-04-11 15:16) [5]

Digitman ©
HWND hWnd;


Ферштейн.

Ascan

Без окон всё таки не обойтись... не пойму, а что мешает создать окно?


 
Ascan   (2005-04-11 15:24) [6]

Eraser, нету. Если у меня нет окон, то зачем мне подключать Forms ?
А события я именно так и пробывал читать (Get/PeekMessage). Только вот они не доходят. Видимо проверка на существование окна происходит раньше.

Что интересно, Регистрация горячих клавишь в системе тоже требует Handle окна, но здесь таких сложностей не возникло, GetMessage все подхватил. А вот с SysTray"ем такая беда...


 
Ascan   (2005-04-11 15:28) [7]

Eraser, предлагаешь создать окно только затем, чтобы Explorer (или кто там) не удалял мою иконку из Tray"я при наведении на нее мышкой?


 
Eraser ©   (2005-04-11 15:32) [8]

Ascan
А события я именно так и пробывал читать (Get/PeekMessage). Только вот они не доходят.


Она не доходят потому что [3]!

Если не секрет, что за паредавал в поле hWnd структуры NOTIFYICONDATA, при вызове ф-ии Shell_NotifyIcon с первым параметром равным NIM_ADD?


 
Eraser ©   (2005-04-11 15:33) [9]

Ascan
предлагаешь создать окно только затем, чтобы Explorer (или кто там) не удалял мою иконку из Tray"я при наведении на нее мышкой?


Именно! А почему нет?...


 
Digitman ©   (2005-04-11 15:34) [10]


> Что интересно, Регистрация горячих клавишь в системе тоже
> требует Handle окна


не выдумывай, вовсе не требует.

вот цитата :

hWnd

Identifies the window that will receive WM_HOTKEY messages generated by the hot key. If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.


 
Ascan   (2005-04-11 15:48) [11]

Eraser,
>> предлагаешь создать окно только затем, чтобы Explorer (или кто там) не удалял мою иконку из Tray"я при наведении на нее мышкой?
> Именно! А почему нет?...

Не эффективно, если без этого можно обойтись.

> Если не секрет, что за паредавал в поле hWnd структуры NOTIFYICONDATA, при вызове ф-ии Shell_NotifyIcon с первым параметром равным NIM_ADD?

То же самое что и при:
RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL
и при:
GetMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax: UINT): BOOL;

В данный момент hWnd = 0, пробывал HInstance, результат тотже. В результате чего я и пришел к выводу, что для регистрации иконки можно указывать что угодно. Получения событий от Горячей клавиши нужен тот же hWnd, а для SysTray, этот hWnd должен быть еще и Существующим Окном.


 
Eraser ©   (2005-04-11 15:51) [12]

Ascan

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

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


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

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


 
Digitman ©   (2005-04-11 15:54) [14]


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


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


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

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

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


 
Digitman ©   (2005-04-11 16:04) [16]


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


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


 
Slym ©   (2005-04-12 11:47) [17]

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


 
DiamondShark ©   (2005-04-13 09:17) [18]


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

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


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

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


 
alpet ©   (2005-04-13 11:33) [20]

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


 
Digitman ©   (2005-04-13 11:48) [21]


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


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


 
alpet ©   (2005-04-13 11:50) [22]

Сделай простейший ресурс диалога (пустое окно) и для создания окна вызвай 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"
{
}


 
Piter ©   (2005-04-13 11:57) [23]

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


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

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


 
alpet ©   (2005-04-13 11:58) [24]

Использование 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.


 
DiamondShark ©   (2005-04-13 12:03) [25]


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

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

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


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

Piter ©   (13.04.05 11:57) [23]


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


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


 
alpet ©   (2005-04-13 12:08) [27]

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

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


 
Piter ©   (2005-04-13 13:54) [28]

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


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


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

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


 
jobo ©   (2005-04-13 18:26) [30]

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


 
Piter ©   (2005-04-13 18:37) [31]

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


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


 
mgcr ©   (2005-04-14 10:58) [32]

Piter ©   (13.04.05 18:37) [31]


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


Есть.


 
alpet ©   (2005-04-14 11:16) [33]

jobo ©   (13.04.05 18:26) [30]
> только скажи как ты экзешник в 9 кб получил?

Скомпилировал весь пример в Delphi 6 (в седьмой должен быть такой же результат). Кстати если его запаковать UPX - будет 6Кб. На ассемблере подобный пример можно наверное и в 2кб уместить, только стоит ли стараться.


 
jobo ©   (2005-04-14 15:05) [34]

2alpet:

на Д7 получается 85 кб, может настройки какие поменять нада?


 
Piter ©   (2005-04-14 18:13) [35]

mgcr ©   (14.04.05 10:58) [32]
Есть.


кто об этом сказал?


 
mgcr ©   (2005-04-14 18:18) [36]

Piter ©   (14.04.05 18:13) [35]

MS конечно. Читай Platform SDK.


 
alpet ©   (2005-04-14 18:21) [37]

>на Д7 получается 85 кб, может настройки какие поменять нада?
1. Надо компилить без отладочной информации. Например для этого можно добавить директиву {$D-} в начале программы, или в настройках проекта (вызывается по Ctrl-Shift) на вкладке Compiler поснимать все флажки в разделе Debugging.
2. Убрать все модули из uses которые не используются в программе.


 
VMcL ©   (2005-04-14 19:03) [38]

>>alpet ©   (14.04.05 18:21) [37]

>1. Надо компилить без отладочной информации. Например для этого можно добавить директиву {$D-} в начале программы, или в настройках проекта (вызывается по Ctrl-Shift) на вкладке Compiler поснимать все флажки в разделе Debugging

Не городите чушь. На размер бинарника это не влияет. Единственное, связанное с отладочной информацией, что влияет на его размер - это Project Options | Linker | Include TD32 debug info


 
alpet ©   (2005-04-14 19:21) [39]

Влияет, хотя и довольно слабо.
Точнее влияние на размер оказывает какая версия VCL используется - отладочная или обычная (флажок "Use Debug DCUs")
Вот например достаточно сложный мой проект (VCL) с отключенной опцией информацией весит 1188352 байт, а с включенной 1296896 байт.
----------------------------------------------------------------
Для приведеннего примера и в самом деле никакок влияния эти опции не имеют.


 
VMcL ©   (2005-04-14 19:29) [40]

>>alpet ©   (14.04.05 19:21) [39]

>флажок "Use Debug DCUs"

Это влияет, причём доволно значительно. Согласен - забыл.


 
jobo ©   (2005-04-16 02:45) [41]

Use Debug DCUs у меня ваще никогда не включался.
пример [24] откомпилированый на Д7 - 87 кб (с $D- тоже самое)
с включеной Use Debug DCUs - 93 кб
как вы ваще умудрились exeшник сделать 9 кб? у мненя самое мальнкое кот былло 15-17 кб (не консольные)


 
GuAV ©   (2005-04-16 14:38) [42]


>  Иконка в SysTray не создавая своих окон.

Лёгко. Регистрируешь своё сообщение, берёшь превое попавшееся окно, субкласишь его, в оконной процедуре ловишь своё сообщение, его же задаёшь в uCallbackMessage.

:-)


 
Eraser ©   (2005-04-16 15:01) [43]

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


Ты прав. Но всё таки очень часто 0 - это рабочий стол...


 
Eraser ©   (2005-04-16 15:06) [44]

mgcr ©

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

Есть.


Как раз таки гарантий мало... не факт что 1 рабочий стол так будет всегда 1... честно говоря я ожидал, что в Longhorn"e сделают несколько раб. столов... как в линухе.


 
Eraser ©   (2005-04-16 15:08) [45]

Ascan

Что мешает использовать старую-добрую API CreateWindow? зачем изощьрятся с разными "полу-API" ф-ми?


 
mgcr ©   (2005-04-18 11:20) [46]

Eraser ©   (16.04.05 15:06) [44]

Ерунду не пиши, договорились ?

Читай вместе с Piter"ом Platform SDK.


 
alpet ©   (2005-04-18 12:22) [47]

jobo ©   (16.04.05 02:45) [41]

Создай заготовку - фaйл test.dpr с текстом:

begin
end.

И скомпилируй его в delphi (из коммандной строки - dcc32 test.dpr).
Размер получившегося test.exe должен быть 8Кб. Если будет больше - видно компилятор слишком много лишнего добавляет - добудь dcc32.exe версии  6.1 (6.0).  Потом добавляй юниты и код, и смотри на каком файле размер exe-шника резко увеличится.


 
alpet ©   (2005-04-18 12:25) [48]

Например у меня размер файла резко увеличивается (до 135Кб) при добавлении модуля Classes или использующих его модулей VCL. Так что его лучше не использовать.


 
Игорь Шевченко ©   (2005-04-18 12:31) [49]

Размерами меряемся в Потрепаловке


 
Piter ©   (2005-04-18 14:54) [50]

mgcr ©   (18.04.05 11:20) [46]
Читай вместе с Piter"ом Platform SDK


ну уж коли ты знаешь где читать, может линк кинешь?


 
mgcr ©   (2005-04-18 15:06) [51]

Piter ©   (18.04.05 14:54) [50]

Открой http://msdn.microsoft.com, набери в строке поиска HWND_DESKTOP и читай статьи по результатам поиска. И будет тебе счастье.



Страницы: 1 2 вся ветка

Текущий архив: 2005.06.06;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.039 c
1-1116869977
Petro_
2005-05-23 21:39
2005.06.06
Scroll у MDIMain


1-1116615022
Volume
2005-05-20 22:50
2005.06.06
Name


4-1113558922
Serr
2005-04-15 13:55
2005.06.06
связь


14-1116559538
gek
2005-05-20 07:25
2005.06.06
Не очень понятная проблема с телевизором


1-1116497362
pavel_guzhanov
2005-05-19 14:09
2005.06.06
вопрос про FastReport 3.0