Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
4-1124713454
Delphi_is_cool
2005-08-22 16:24
2005.10.23
Как установить интервал таймера 1 микросекунда


2-1128343256
Vladimir88
2005-10-03 16:40
2005.10.23
TreeView


3-1126670756
Andrey V.
2005-09-14 08:05
2005.10.23
помогите "развернуть" таблицу "горизонтально"


6-1120273852
yurikon
2005-07-02 07:10
2005.10.23
ICQ


2-1127457227
новенький
2005-09-23 10:33
2005.10.23
Сортировка данных





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский