Форум: "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.55 MB
Время: 0.011 c