Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-57359
M@XIDROM
2002-02-28 16:57
2002.03.18
Scrollbar XP


4-57564
Serhy
2002-01-16 01:57
2002.03.18
Интересное в ShellExecute


14-57512
chernoruk
2002-02-04 18:35
2002.03.18
Connect to the Internet


3-57314
gegc
2002-02-18 15:38
2002.03.18
Обновление таблицы


14-57515
McSimm
2002-02-04 17:53
2002.03.18
Клиент для форумов. Dolphin 1.1





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