Главная страница
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"

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



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

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

Наверх




Память: 0.57 MB
Время: 0.066 c
1-1116665446
злобная танька
2005-05-21 12:50
2005.06.06
нарисовать линию на скролбоксе


4-1113414663
Flutter
2005-04-13 21:51
2005.06.06
Windows shell


1-1116836846
avtsasha
2005-05-23 12:27
2005.06.06
открыть файл в hex


11-1098280221
Unknown Mystic
2004-10-20 17:50
2005.06.06
Компиляция.


3-1114688684
Dimedrol
2005-04-28 15:44
2005.06.06
Не исполняется stored proc. через ADO...