Текущий архив: 2005.10.23;
Скачать: CL | DM;
ВнизКак создать программку ТРЕЙ? Найти похожие ветки
← →
ronyn (2005-08-24 01:51) [0]Я так понимаю в некоторых случаях в трей загоняют отдельную программку, которая запускает другие, крупные, что бы оперативку не жрать. И те , что в трее берут по 40-700 КБ. Ну вобщем совсем не много. У меня у BlueTooth такая штука. Так вот как такую программку сделать, что б в трее висела. и оперативки брала не больше мега? А через её Popup другие запускать можно было. Заранее благодарен.
← →
KilkennyCat © (2005-08-24 02:01) [1]Возможно, вообще-то, три варианта.
Первый, Вами описанный, второй - программа одна, висит целиком, и третий - программа одна, грамотно сделанная, в трейсвернутом виде высвобождает ресурсы.
← →
ronyn (2005-08-24 02:11) [2]первый - мной описаный
второй - я использовал
третий - хотел в перспективе использовать
Но в данный момент мне надо узнать, как сделать программу первого типа.
← →
Юрий Зотов © (2005-08-24 02:12) [3]Не больше метра для такой малюсенькой программульки? Кошмар...
Не более 20 кило - вот это нормально. Сохраните этот пример в файле TrayWithoutVCL.dpr, загрузите его в Delphi и запустите. Потом модифицируйте, как Вам нужно.
program TrayWithoutVCL;
uses
Windows,
Messages,
ShellAPI;
const
AppName = "WinApiTrayApp";
WM_TRAYMSG = WM_USER + 100;
var
WndClass: TWndClassEx;
WndHandle: HWND = 0;
Msg: TMsg;
IconData: TNotifyIconData;
IconMenu: HMENU = 0;
SecondIcon: HICON;
function WndFunc(Wnd, Msg: DWORD; wParam, lParam: integer): integer; stdcall;
var
P: TPoint;
begin
case Msg of
WM_DESTROY, WM_QUERYENDSESSION:
begin
Result := Integer(Msg = WM_QUERYENDSESSION);
PostQuitMessage(0)
end;
WM_TRAYMSG:
begin
Result := 0;
if (lParam = WM_RBUTTONDOWN) and GetCursorPos(P) then
begin
SetForegroundWindow(Wnd);
TrackPopupMenuEx(IconMenu, 0, P.X, P.Y, Wnd, nil);
PostMessage(Wnd, WM_NULL, 0, 0)
end
end;
WM_COMMAND:
begin
Result := 0;
case wParam and $FFFF of
0: begin
if IconData.hIcon = SecondIcon then
IconData.hIcon := WndClass.hIcon
else
IconData.hIcon := SecondIcon;
Shell_NotifyIcon(NIM_MODIFY, @IconData)
end;
1: PostMessage(Wnd, WM_CLOSE, 0, 0)
end
end;
else
Result := DefWindowProc(Wnd, Msg, wParam, lParam)
end
end;
{ -------------------------------------------------------------------------------------------- }
begin { main }
with WndClass do
begin
cbSize := SizeOf(WndClass);
Style := CS_HREDRAW or CS_VREDRAW ;
lpfnWndProc := @WndFunc;
hIcon := LoadIcon(0, IDI_EXCLAMATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := hBrush(COLOR_WINDOW);
lpszMenuName := nil;
lpszClassName := AppName;
hIconSm := hIcon
end;
WndClass.hInstance := hInstance;
if RegisterClassEx(WndClass) = 0 then
Exit;
WndHandle := CreateWindowEx(WS_EX_TOOLWINDOW, AppName, AppName, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, 0, 0, hInstance, nil);
if WndHandle = 0 then
Exit;
with IconData do
begin
cbSize := SizeOf(IconData);
Wnd:= WndHandle;
uID := 100;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := WM_TRAYMSG;
hIcon:= WndClass.hIcon;
szTip := AppName
end;
if Shell_NotifyIcon(NIM_ADD, @IconData) then
try
IconMenu := CreatePopupMenu;
if IconMenu <> 0 then
try
if AppendMenu(IconMenu, MF_STRING, 0, "Сменить иконку") and
AppendMenu(IconMenu, MF_STRING, 1, "Выход") then
begin
SecondIcon := LoadIcon(0, IDI_QUESTION);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end
end
finally
DestroyMenu(IconMenu)
end;
finally
Shell_NotifyIcon(NIM_DELETE, @IconData)
end
end.
← →
ronyn (2005-08-24 02:22) [4]сделал - память 2 048 кв. по-моему речь шла о 20 кв
← →
ronyn (2005-08-24 02:39) [5]Как уменьшить объем потребляемой памяти?
← →
Германн © (2005-08-24 02:58) [6]Я чо-то тут вообще ни бум-бум!
1. Что-такое - "в трей загоняют отдельную программку"?
2. Что-такое - "которая запускает другие, крупные, что бы оперативку не жрать."
Похоже, автору не очень скоро светит стать "самураем"!
← →
Юрий Зотов © (2005-08-24 03:05) [7]> ronyn (24.08.05 02:39) [5]
Размер Exe какой? У меня - чуть больше 16 Кб. А меньше для подобной задачи в Delphi не получишь, поскольку это чистейший
код WinAPI, никаких VCL тут не используется. И он минимальный, здесь нет ничего лишнего.
Это сам Exe. Но он еще грузит и системные библиотеки, без которых не обойтись никак. Хоть в Delphi, хоть не в Delphi.
← →
Defunct © (2005-08-24 03:48) [8]ronyn (24.08.05 02:39) [5]
{$M 16384, 16384}
сильно не уменьшит, но кб на 400 должен.
← →
DVM © (2005-08-24 10:10) [9]
> Как уменьшить объем потребляемой памяти?
не создавать окна.
← →
dmitry501 © (2005-08-24 10:18) [10]Еще можно подменить system.pas Обратитесь в форум по KOL.
← →
Юрий Зотов © (2005-08-24 10:49) [11]> DVM © (24.08.05 10:10) [9]
А кому же тогда будут отсылаться сообщения? Это же tray-программа.
← →
DVM © (2005-08-24 11:21) [12]
> А кому же тогда будут отсылаться сообщения? Это же tray-программа.
Интересно, а поместить иконку в область уведомлений и принять от нее сообщение можно ли как без окна. Единственное что приходит в голову подставить чужое окно и ловушкой отслеживать сообщения. Только меньше в памяти оно будет вряд ли места занимать.
← →
sniknik © (2005-08-24 11:38) [13]> У меня - чуть больше 16 Кб. А меньше для подобной задачи в Delphi не получишь
дельфи 6 используется?
у меня на 7-ке это же = 8,50 КБ (8 704 байт), на 6-ке должно быть еще чуть меньше, правда это с заменами KOL. (минимальный exe-шник получал 4,5кб). могу выслать на "посмотр". или сам сделай если интересно.
но вообщето я этими заменами я не пользуюсь, т.к. вот этот как раз (но вообще многие) екзешник определяется антивирусом как MultiDropper-JD Trojan... ну в обшем не стоит того, а так без замен получается 19кб.
← →
Defunct © (2005-08-24 18:48) [14]> у меня на 7-ке это же = 8,50 КБ (8 704 байт),
у меня 15.9K (15872 байт)
← →
vrem (2005-08-24 19:09) [15]Подмены какие то. Изначально про размер проги в оперативной памяти говорилось, наобещали 20 килобайт, а когда не вышло - оказывается это всего лишь размер проги на диске.
← →
Игорь Шевченко © (2005-08-24 19:13) [16]
> Я так понимаю в некоторых случаях в трей загоняют отдельную
> программку, которая запускает другие, крупные, что бы оперативку
> не жрать
Неправильно понимаешь.
← →
sniknik © (2005-08-24 20:36) [17]Defunct © (24.08.05 18:48) [14]
еше наверное от операционки зависит, вот дома перекомпилил под 2000ми (на работе XP), дельфя вроде одинаковая с теми же апдейтами, без доп. компонент. а получилось 16,5 КБ (16 896 байт) против 19ти на работе (см. без замен).
а с заменами 7,00 КБ (7 168 байт) получилось.
← →
Defunct © (2005-08-24 21:13) [18]sniknik © (24.08.05 20:36) [17]
> а с заменами 7,00 КБ (7 168 байт) получилось.
аж не верится ;>
в TC
main()
{
printf("hello world");
}
и то больше будет
← →
sniknik © (2005-08-24 22:20) [19]> аж не верится ;>
выслать?
только как писал оно определяется типа трояном (McAfee 8.0i), но ты не верь это именно то что Ю. Зотов привел, только скомпиленное.
кстати можеш еще посмотреть, писал когдато, еще под 6ку
http://delphi.chertenok.ru/forum/my_download.php?tema=del&action=show&id=173
там кода побольше, а размер с теми же заменами, 11 кб гдето (вместе с исходниками в архиве лежит, и попробуй сам скомпилить...).
возможно сейчас и это трояном будет определятся, но тогда нет. толи трояны новые завелись толи 7ка другой exe стала выдавать...
← →
ronyn (2005-08-25 01:16) [20]На чем тогда написана программка у меня в трее? На асме? Ведь она берет всего 40 кв.
← →
Германн © (2005-08-25 02:57) [21]2 ronyn (25.08.05 01:16) [20]
>На чем тогда написана программка у меня в трее? На асме? Ведь >она берет всего 40 кв.
А у Вас в трее таки сидит программка? Таки, имхо стоит сообщить Б.Гейтсу сей факт!
Токмо, сначала, стоит разобраться "что она берет" и как посчитаны вышеупомянутые 40 кв. (Кстати, я так и не понял "сколько галош в одном "кв""?)
← →
Игорь Шевченко © (2005-08-25 09:59) [22]
> На чем тогда написана программка у меня в трее?
Трей в студию
← →
Буги Буги (2005-09-30 01:51) [23]О чем вы я не могу решить задачу с упорядовачением по алфавиту
Страницы: 1 вся ветка
Текущий архив: 2005.10.23;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.042 c