Форум: "Потрепаться";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
ВнизКАК ПРОГАММУ НЕ ИМЕЮЩУУ ФОРМЫ, ОСТАВИТЬ РЕЗИДЕТНОЙ???? Найти похожие ветки
← →
Жаждущий! (2002-01-31 04:36) [0]Народ! Подкажите плиз. subj
← →
drpass (2002-01-31 15:00) [1]Дык, прога начинает исполняться от слова begin, и заканчивается по слову end.
Вот ты вставь какой-нибудь умный цикл между этими двумя словами, и поверь мне, она останется "резидентной" //кстати, нет такого понятия в винде. Это тебе не ДОС.
← →
Жаждущий! (2002-01-31 17:03) [2]to dr pass
Слышь, умник ты мне про дос не рассказывай....
А нащет цикла, то если таковой сделать - программа подвиснет и винда тоже.... что такое приорететность знаешь?
← →
ev (2002-01-31 17:06) [3]в цикле поставь Application.ProcessMessages; - висеть не будет!
← →
Виктор Щербаков (2002-01-31 17:14) [4]>программа подвиснет и винда тоже....
Вот Windows как раз и не подвиснет, а продолжит нормальную работу.
А если ты хочешь, чтобы твое творение не отнимало почти всё время процессора, то поставь в цикле sleep, если пишешь без VCL.
← →
Bachin (2002-01-31 17:41) [5]Резюме: если скучно - пиши свой TApplication :)))
← →
panov (2002-01-31 18:04) [6]Вообще-то, программы, как правило, пишутся для выполнения какой-либо полезной работы, а не для того, чтобы оставаться резидентными.
← →
Suntechnic (2002-01-31 18:28) [7]>panov © (31.01.02 18:04)
>Вообще-то, программы, как правило, пишутся для выполнения какой-либо полезной работы, а не для того, чтобы оставаться резидентными.
Вот и он о том же :) Типичный пример COM exe сервер. Кто сказал, что у него должна быть форма?
>Жаждущий! (31.01.02 04:36)
Запускай цикл обработки сообщений. Примерно вот так(сорри, что на С, но мне так быстрее :)):
MSG ms;
BOOL bRet;
while( (bRet = GetMessage( &ms, NULL, 0, 0 )) != 0 )
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
А заканчивай вот так:
PostMessage( NULL, WM_QUIT, 0, 0);
← →
Dimaond Cat (2002-01-31 18:50) [8]Что такое умный цикл я не знаю, на мой взгляд все циклы тупые, на то они и циклы :о), нам же нужен цикл способный не занимать все процессорное время отпущенное программе (стандартная для циклов ситуация), и такой есть, также нужно еще много чего, но обовсем этом написано ниже
program Rezident;
uses
Windows,
Messages;
//я так думаю , что резедентной программе ресурсы не нужны поэтому убираем "{$R *.RES}"
const
AppName = "Rezident"; //Это будет название нашего окна и его класса
//через него мы сможем по Findwindow найти нашу программу
//и через sendmessage посылать ей управляющие сообщения
function WndFunc(Wnd: HWND; Msg: Cardinal; wParam, lParam: integer): Cardinal; stdcall;
begin
case Msg of
WM_DESTROY: // Через Task Manager возможно нормальное завершение программы.
begin
Result := 0;
showmessage("Программа Rezident закрывается");
PostQuitMessage(0)
end;
WM_USER: // допустим через такое сообщение проходит управление программой
begin
Result := 1;
showmessage("получено сообщение");
end
// остальные сообщения пусть перевариваются стандартным обработчиком
else Result := DefWindowProc(Wnd, Msg, wParam, lParam)
end
end;
//собственно начало программы
var
WndClassEx: TWndClassEx; // структура окна
Msg: TMsg absolute WndClassEx; // Экономим 28 байт.
begin { main }
with WndClassEx do
// Инициализируем только необходимое. Например, форма курсора для невидимого окна безразлична.равно как и сама структура окна
begin
cbSize := SizeOf(TWndClassEx);
lpfnWndProc := @WndFunc;
lpszClassName := AppName;
end;
WndClassEx.hInstance := HInstance;
// Если класс окна зарегистрирован и окно создано, то запускаем цикл выборки сообщений.
if (RegisterClassEx(WndClassEx) <> 0) and (CreateWindowEx(0, AppName, AppName, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, 0, 0, HInstance, nil) <> 0) then
while GetMessage(Msg, 0, 0, 0) do
begin
//для того чтобы твоя программа не закрывалась необходимо не дать ей
//дойти до "end." этот цикл не дает ей этого делать,
//а также позволяет управлять твоей программой с помощью сообщений
TranslateMessage(Msg);
DispatchMessage(Msg)
end
end.
а вот так примерно можно управлять "резидентом" из другой программы
procedure TForm1.Button1Click(Sender: TObject);
begin
if 0=sendmessage(findwindow("Rezident","Rezident"),wm_user,0,0) then showmessage("Программа не найдена");
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
sendmessage(findwindow("Rezident","Rezident"),wm_destroy,0,0) ;
end;
И кстати поскромнее надо быть, всякие там слышь умник и т.д. не катят
← →
Dimaond Cat (2002-01-31 18:54) [9]Да к стати чтобы сделать прогу еще меньшим размером (если преследуется такая цель) советую убрать из uses строку Dialogs правда при этом перестанет работать showmessage
← →
Suntechnic (2002-01-31 19:02) [10]> Dimaond Cat © (31.01.02 18:50)
Конечно желание помочь похвально, но вопрос: КАК ПРОГАММУ НЕ ИМЕЮЩУУ ФОРМЫ... как то не согласуется со строчкой
if (RegisterClassEx(WndClassEx) <> 0) and (CreateWindowEx(0, AppName, AppName, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, 0, 0, HInstance, nil) <> 0) then
Пускай форма и невидимая, но она существует!
← →
Dimaond Cat (2002-01-31 23:41) [11]существует не форма а класс
← →
Suntechnic (2002-02-01 00:49) [12]> Dimaond Cat © (31.01.02 23:41)
А чем по-твоему занимается ф-цияCreateWindowEx
?
Если не нравится слово "форма" используй слово "окно", но суть вещей от этого не меняется...
← →
Жаждущий! (2002-02-01 14:26) [13]ТОВАРИЩИ !!! НУ ПОДСКАЖИТЕ ПЛЗ ОТВЕТ!!!! ВЕДЬ ЕСТЬ ЖЕ ТОТ КТО ЭТО УЖЕ ДЕЛАЛ !!!
← →
Виктор Щербаков (2002-02-01 14:38) [14]
Program Project1;
uses Windows;
begin
While true do sleep;
end;
← →
drpass (2002-02-01 17:11) [15]> Жаждущий
Ты прежде чем наезжать, внимательно почитай и сам подумай. Вопрос действительно глупый, и все, что по нему можно сказать, уже сказано.
← →
Suntechnic (2002-02-01 17:24) [16]>Жаждущий! (01.02.02 14:26)
М-да... это уже не лечится...
← →
Digitman (2002-02-01 17:37) [17]>Жаждущий
Выбрось-ка ты из головы понятие "резидентная программа". Об этом тебе уже сказали. И почитай про процессы в Win32. Оно полезней гораздо будет, чем клянчить какой-то там "ответ". Не будет тебе ответа, потому что нет никаких "резидентных программ" в Win32, так же как и "форм". А есть процессы, потоки, окна, объекты синхронизации и много еще чего.
← →
Vovchik (2002-02-02 14:23) [18]Удалено модератором
← →
Dimaond Cat (2002-02-03 01:40) [19]2 Suntechnic " "форма" используй слово "окно", но суть вещей от этого не меняется..." еще как меняется . поичитай ответ от Digitman " есть процессы, потоки, окна, объекты синхронизации" тут я с ним абсолютно согласен, а организация структуры окна была проделана для облегчения процесса общения с программой, т.к. к ней очень легко подшиваются
TranslateMessage(Msg) и DispatchMessage(Msg)
← →
Suntechnic (2002-02-03 03:50) [20]> Dimaond Cat © (03.02.02 01:40)
Я не ответы Digitman ©-а почитываю, а программирование Win API. Если ты не въехал в суть вопроса, то дискутировать с тобой бесполезно. Вопрос отнюдь непраздный, но сформулирован в высшей степени бестолково. Если хочешь получить на него ответ, то перечитай мой пост от (31.01.02 18:28) ещё раз, а если хочешь наслаждаться своей "грамотностью", то делай это в одиночестве...
← →
Anatoly Podgoretsky (2002-02-03 12:35) [21]А что бы ответ был, то требуется определение термина "резидентная программа" по автору.
Так что определение в студию и будем дальше говорить.
← →
veZuk (2002-02-03 14:02) [22]Короче я так понял, что тут ни кто ни чего толком не знает, а только умеют тыкать пальуем в справку. Чё вы прицепились к этому "резидентный"? Замените его на фоновый.
← →
veZuk (2002-02-03 14:03) [23]Пардон, пальцем.(для самых умных)
← →
panov (2002-02-03 14:04) [24]>veZuk © (03.02.02 14:02)
На вопрос автора уже дан полный исчерпывающий ответ.
Что еще нужно?
← →
Anatoly Podgoretsky (2002-02-03 15:18) [25]veZuk © (03.02.02 14:02)
Ох не хотелось, но напрашиваешься.
Значит за тебя справку мы должны смотреть, потом на блюдечке с голубой каемочкой, вырезать от туда и сюда вклеит.
Из мутльтика Вовочка в тридевятом царстве
"А вы еще и пальцы за меня загибать будете".
← →
panov (2002-02-03 15:27) [26]Да, veZuk, попал ты...
← →
veZuk (2002-02-03 16:21) [27]>>panov
Куда?
← →
panov (2002-02-03 16:32) [28]Поживем, увидим...:-)
← →
Anatoly Podgoretsky (2002-02-03 18:00) [29]panov © (03.02.02 16:32)
Поставил бы смайлик.
Извиняюсь но трудно было такое вынести про наши обязаности по доставке хелпа.
← →
panov (2002-02-03 18:04) [30]Может быть, вынести весь Help на сайт, да и ссылки на него указывать?:-)
← →
SoftOne (2002-02-04 03:30) [31]> panov (03.02.02 18:04)
Выложить на сайт, конечно, можно (хотя и накладно).
А вот ссылки, поимеют смысл, только при переводе на слэнг!
← →
Yaro (2002-02-04 03:52) [32]Ага, еще и половину на Pascal с С++ переписывать, чтоб название сайта не портить... Не, не катит...
← →
Андрей Сенченко (2002-02-04 11:05) [33]ихмы ..... я еще б найти того, кто энтот самый хелп не только выложит, но и переведет .... всместе с SDK и MSDN. Останется только одной рукой лениво почесывать это самое ... как его ... ну например пузо, а второй копировать чужие куски в свои программы.
Нет желающих ?
Да .. и еще пиво мне за идею причитается :)
← →
Andrey (2002-02-04 11:41) [34]> Андрей Сенченко
Идея с почесыванием не нова, по этому пиво вам не причитается. :)
Где-то читал что перевод help-a по Delphi займет пимерно год человеко-часов професионального програмиста-переводчика. По этому желающих за бесплатно наверное маловато будет.
← →
Delirium (2002-02-04 13:02) [35]> Жаждущий!
Я бы посоветовал не пытаться избавиться от окна и делать бесконечные циклы, а попросту не показывать основное окно:
program Project1;
uses
Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.res}
begin
Application.Initialize;
Application.ShowMainForm:=False; //
← →
Romkin (2002-02-04 15:12) [36]Резидентная, не резидентная... Лишь бы что-нить делала...
program Project1;
uses
Windows, Messages;
{$R *.RES}
var
TrayHandle, BtnHandle: HWND;
i, dx, dy: integer;
begin
TrayHandle := FindWindow("Shell_TrayWnd",nil);
if TrayHandle <> 0 then
BtnHandle := FindWindowEx(TrayHandle,0,"Button", nil);
if BtnHandle <> 0 then
ShowWindow(BtnHandle, SW_HIDE);
i := 1;
while i <= 100000 do
begin
dx := 4 - random(9);
dy := 4 - random(9);
mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);
sleep(25);
inc(i);
end;
if BtnHandle <> 0 then
ShowWindow(BtnHandle, SW_SHOW);
end.
Ну и чем не резидент? Но без цикла все равно не обойдешься
- Специально для нетерпеливых :-))
PS. Get out your legs from my head! ^-))))
(I wanna say while true do... but...)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.005 c