Форум: "Потрепаться";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
ВнизКАК ПРОГАММУ НЕ ИМЕЮЩУУ ФОРМЫ, ОСТАВИТЬ РЕЗИДЕТНОЙ???? Найти похожие ветки
← →
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;
И кстати поскромнее надо быть, всякие там слышь умник и т.д. не катят
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c