Delphi. Программа без формы. Нужна Ваша помощь.

Ламерюга 04.05.2004 - 22:40 | Сейчас делаю программу, которая будет менять заголовок окошка другого приложения в зависимости от ситуации. Ничего особенного, но программа по идее после запуска должна прятаться, т.е., думаю, всё это можно сделать и без формы. Вопрос вот в чём: можно ли всё это сделать без Forms в Uses, если у меня в программе есть события OnCreate и OnClose формы??? Помогите, плиз советом, сам я такого никогда не делал... ЗЫ: да, ещё есть событие он таймер.
Deflorator 1 - 04.05.2004 - 23:02 | можно, если форму будешь делать ручками, через апи. только зачем тебе форма для изменения заголовков? можно и вовсе без формы.
archimag 2 - 05.05.2004 - 01:17 | А таймер тебе зачем? Ты поподробней напиши что хочешь, а то не совсем понятно. Таймер можно и без окна обрабатывать. Если и другие невизуальные компоненты использовать хочешь, то есть деталь... Если окну при создании указать родителя HWND_MESSAGE, то получится message-only окно, которое невидимо, в Z последовательности не нумеруются, а работает только на обмен сообщений (по крайней мере в чистом API такой приём хорошо работает).
FWP 3 - 05.05.2004 - 08:32 | Ну вирус человек пишет. Видимо делать больше нехрен. И еще нас вопросами доствать!
155 4 - 05.05.2004 - 09:19 | troyan)))
UE 5 - 05.05.2004 - 11:20 | 2archimagm, HWND_MESSAGE, по-моему, есть только win2k и выше...
Ламерюга 6 - 05.05.2004 - 11:25 | Нет, не вирус, не троян пишу, но что-то близкое. Это - программа-прикол. Хочу над братом младшим поиздеваться. Программа должна при открытии определённых сайтов Explorer'ом через минуту показывать мигающий заголовок окна, потом перетащить это окошко вниз, а потом вывести сообщение типа "Миша! Не ходи на такие сайты." Скажете, фигнёй человек страдает... Да, может так, но надо это очень. Вот программа уже почти написана, не знаю, как это сделать без Forms. Но ведь есть событие OnCreate, на что его можно заменить?
UE 7 - 05.05.2004 - 12:11 | А нельзя ли в OnCreate перетащить форму за экран и изменить стили так, чтобы на панели задач формы не было?
archimag 8 - 05.05.2004 - 14:23 | UE, HWND_MESSAGE поддерживается в NT 5.0 и 98-х( #if(WINVER >= 0x0500) ).
UE 9 - 05.05.2004 - 14:48 | 2archimag, спасибо за инфу.
mif 10 - 05.05.2004 - 15:11 | В барсике есть процедура, которую можно запускать до загрузки первой формы если эту процедуру зациклить (например вставить туда Sleep 100 и все что нужно), то программа будет в памяти и ресурсы жрать не будет, а форму можно грохнуть - все равно она грузиться не будет. Думаю и в делфи все это есть. Вот человек говорит, что нужно при создании проекта выбрать консольное приложение или что-то похожее.
Младший Брат Ламерюги 11 - 05.05.2004 - 15:24 | а спорим, брат, я раньше тебя эту прогу напишу! ведь я пишу на VC :-)))
mif 12 - 05.05.2004 - 16:42 | Какая разница на чем пишешь - сплошное API. Хоть на win-асме пиши все равно API. Человеку знающему что и чем делать тут на несколько десятков минут работы, а квалифицированному API-шнику 10 мин. Тут нужно-то: Sleep GetWindowText GetWindowTextLength (можно и без нее) SetWindowText например GetWindowRect и MoveWindow или SetWindowPos FlashWindow Может еще какая мелочевка.
1111 13 - 07.05.2004 - 09:13 | Можешь оставить свою форму (хотя она и не нужна), указать в свойствах Object Inspectorа width и height формы 0, там же отключить показ заголовка окна, кнопок минимизации и т.п., а потом вешай таймер и как правильно сказали в посте выше с помошью функций API (в крайнем случае поищи их описание в хелпе) - меняй что хочешь.
VaS 14 - 07.05.2004 - 11:08 | ... Application.Initialize; Application.ShowMainForm := False; Application.CreateForm(TForm1, Form1); Application.Run; ...
Ламерюга 15 - 08.05.2004 - 10:21 | Вот, блин, умники. Я же сазал, БЕЗ FORMS! А Вы пишете Application.CreateForm(TForm1, Form1);
Creative 16 - 08.05.2004 - 11:08 | Ну вы народ даёте... неужели трудно забить поиск в том же яндексе и полазить по FAQ-ам... ( в первую очередь это конечно к автору относится ) (15) Держи примерчик... там есть всё что тебе нужно... Один из способов создать такой проект в Delphi - в меню File | New... выбрать Console Application и удалить строку {$APPTYPE CONSOLE}. Почти для любого действия нам понадобится окно. Но видеть нам его не нужно. Поэтому, создадим невидимое окно. Для этого нужно зарегистрировать класс окна и создать его, но не показывать. Эти два действия происходят в функции CreateMyWnd. Чтобы было возможно общение пользователя с программой, можно сделать TrayIcon (иконку справа на панели задач). Она создается в процедуре CreateTray. Иконку я взял, наверное, не самую подходящую, но это для примера. Точно так же можно взять собственную иконку. Для tray также нужно всплывающее меню. Здесь оно создается в функции CreateMyMenu и состоит всего из одного пункта. Резидентные программы обычно отслеживают что-то. Для этой цели бывает необходим таймер. Создается он при помощи SetTimer. Чтобы наша программа не "тормозила" компьютер, приоритет программы лучше всего установить в самый низкий. Конечно, это хорошо не во всех случаях, но иногда это весьма полезно. Эта программа занимается тем, что запускает ScreenSaver при сдвиге курсора в левый верхний угол (координаты курсора проверяются каждую секунду) и при нажатии клавиши Pause (реализуются через HotKey). Задача, конечно, не самая актуальная. Присылайте, пожалуйста, ваши идеи по поводу задач для резидентной программы. program MyResident; uses Windows, ShellAPI, Messages; const ClassName = 'MyResident'; { Имя класса } WM_NOTIFYTRAYICON = WM_USER + 1; { Это сообщение будет генерироваться при событиях с tray } var menu: hMenu; { Всплывающее меню } mywnd: hWnd; { Окно программы } function MyWndProc(wnd: hWnd; msg, wParam, lParam: longint): longint; stdcall; var p: TPoint; s: array [0..255] of char; tray: TNotifyIconData; begin case msg of WM_TIMER: begin { Событие таймера } GetCursorPos(p); if (p.x = 0) and (p.y = 0) then begin { Проверка координат курсора } { Если ScreenSaver еще не запущен - запустить: } GetClassName(GetForegroundWindow, s, length(s)); if s <> 'WindowsScreenSaverClass' then SendMessage(wnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0); end; result := 0; end; WM_NOTIFYTRAYICON: begin { Событие tray } { Если нажата правая кнопка, показать меню: } if lparam = WM_RBUTTONUP then begin GetCursorPos(p); TrackPopupMenu(menu, TPM_LEFTALIGN, p.x, p.x, 0, wnd, nil); end; result := 0; end; WM_COMMAND: begin { Выбран пункт меню } { Если выбран нулевой пункт (здесь - единственный) - закрыть программу: } if lo(lparam) = 0 then SendMessage(mywnd, WM_CLOSE, 0, 0); result := 0; end; WM_HOTKEY: begin { Нажата горячая клавиша } { Запуск хранителя экрана: } SendMessage(wnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0); result := 0; end; WM_DESTROY: begin { Закрытие программы } { Удаление tray: } with tray do begin cbSize := sizeof(TNotifyIconData); wnd := mywnd; uID := 0; end; Shell_NotifyIcon(NIM_DELETE, @tray); PostQuitMessage(0); result := 0; end; else Result := DefWindowProc(wnd, msg, WParam, LParam); end; end; function CreateMyWnd: hWnd; var wc: WndClass; begin { Гегистрация класса: } wc.style := 0; wc.lpfnWndProc := @MyWndProc; wc.cbClsExtra := 0; wc.cbWndExtra := 0; wc.hInstance := hInstance; wc.hIcon := 0; wc.hCursor := 0; wc.hbrBackground := COLOR_WINDOW; wc.lpszMenuName := nil; wc.lpszClassName := ClassName; if RegisterClass(wc) = 0 then halt(0); { Создание окна: } result := CreateWindowEx(WS_EX_APPWINDOW, ClassName, 'My Window', WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, nil); if result = 0 then halt(0); end; procedure CreateTray; var tray: TNotifyIconData; begin { Создание tray: } with tray do begin cbSize := sizeof(TNotifyIconData); wnd := mywnd; uID := 0; uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallBackMessage := WM_NOTIFYTRAYICON; hIcon := LoadIcon(0, IDI_ASTERISK); szTip := ('My Resident'); end; Shell_NotifyIcon(NIM_ADD, @tray); end; function CreateMyMenu: hMenu; begin { Создание меню: } result := CreatePopupMenu; if result = 0 then halt(0); if not AppendMenu(result, MF_STRING, 0, 'Exit') then halt(0); end; var msg: TMsg; begin mywnd := CreateMyWnd; // Создание окна CreateTray; // Создание tray menu := CreateMyMenu; // Создание меню SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_IDLE); { Установка низкого приоритета } RegisterHotKey(mywnd, 0, 0, VK_PAUSE); // Регистрация "горячей клавиши" SetTimer(mywnd, 0, 1000, nil); // Создание таймера while (GetMessage(msg, 0, 0, 0)) do begin TranslateMessage(msg); DispatchMessage(msg); end; KillTimer(mywnd, 0); // Уничтожение таймера UnregisterHotKey(mywnd, 0); // "Уничтожение" горячей клавиши end.
VaS 17 - 08.05.2004 - 11:49 | Автору: Выбирай выражения.

>>