![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Иконка в SysTray не создавая своих окон. [D7, WinXP]
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 это практически не скажется..., так в чём же неэффективность?