Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

Иконка в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.014 c
4-1113727212
Grief
2005-04-17 12:40
2005.06.06
невидимое письмо


3-1114445154
Гость2
2005-04-25 20:05
2005.06.06
Можна ли "выделить" из таблицы уникальные записи?


1-1116499390
Grief
2005-05-19 14:43
2005.06.06
Клейкое окошко...


5-1087272276
Sun bittern
2004-06-15 08:04
2005.06.06
Проблема с событием OnPaint :(


6-1108481093
НовичокОК
2005-02-15 18:24
2005.06.06
Как узнать имя пользователя (компа) занявшего ресурс?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский