Вопрос № 32379: Уважаемые эксперты!!!
Как программно прописать в реестре свой тип файла и при открытии этого файла моя программа сама загружала этот файл в RichEdit?...Вопрос № 32392: Здравствуйте! С наступающим Новым Годом!
Нужно отловить запуск приложения и закрыть его.
Вот так происходит закрытие по заголовку:
PostMessage(FindWindow(Nil, 'Заголовок окна'), WM_QUIT, 0, 0);
Но как узнать когда это приложение поя...Вопрос № 32402: Здравствуйте!
У меня Delphi 2005, создаю я форму и ставлю её значение Visible := False, но при запуске форму всё равно видно! Как сделать что бы формы не было видно??
И ещё вопрос: как скрыть приложение от диспетчера задач?...
Вопрос № 32.379
Уважаемые эксперты!!!
Как программно прописать в реестре свой тип файла и при открытии этого файла моя программа сама загружала этот файл в RichEdit?
Отправлен: 29.12.2005, 13:44
Вопрос задал: Sassoft (статус: Посетитель)
Всего ответов: 6 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Romodos
Здравствуйте, Sassoft!
Для этого можете воспользоваться моим компонентом RegAsso(romodos.narod.ru/regasso.zip)
Описание действий в приложении
А вот при открытиии вашей проги в событии формы OnCreate пропишите
что-то вроде richedit.lines.loadfromfile(paramstr(1));
Тогда файл откроется.
Думаю работать с реестром вы умеете:)
А если не умеете, то в хелпе все подробно расписано, да и в исходниках моего компонента это можно увидеть
Приложение:
--------- FAQ me off!
Ответ отправил: Romodos (статус: Студент)
Отправлен: 29.12.2005, 14:28
--------- Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 29.12.2005, 15:00
Отвечает: Toxic~Fire
Здравствуйте, Sassoft!
Для большего совершенства твоего зарегистрированного файла используй функцию RegWriteStr работы с реестром. Вот она:
function RegWriteStr(RootKey: HKEY; Key, Name, Value: string): Boolean;
var
Handle: HKEY;
Res: LongInt;
begin
Result := False;
Res := RegCreateKeyEx(RootKey, PChar(Key), 0, nil, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, nil, Handle, nil);
if Res <> ERROR_SUCCESS then
Exit;
Res := RegSetValueEx(Handle, PChar(Name), 0, REG_SZ, PChar(Value),
Length(Value) + 1);
Result := Res = ERROR_SUCCESS;
RegCloseKey(Handle);
end;
Дальше смотри программу (регистрируем расширение *.xxx)
Приложение:
Ответ отправил: Toxic~Fire (статус: 1-ый класс)
Отправлен: 29.12.2005, 15:03
Отвечает: Schmak
Здравствуйте, Sassoft!
Я приведу пример для BMP файла (впрочем прописание других типов ничем не отличается), взятый из книги М.Фленова "Delphi глазами Хакера"Ж
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('.BMP' , True);
Reg.WriteString('', 'BMPfile');
Reg.CloseKey;
2) Для того. чтобы открыть файл необходимо прочитать параметры, с которыми он был открыт. Загвоздка может быть в том, что параметры разделяются пробелами, но в имени файлов или папок он тоже может присутствовать, поэтому лучше считывать все параметры и объединять их в одну строку.
var
Str:String;
i:Integer;
begin
if (ParamCount > 0) then
begin
Str:=ParamStr(1);
for i:=2 to ParamCount do
begin
Str:=Str+' '+ParamStr(i);
end;
RichEdit1.Lines.LoadFromFile;
end;
--------- Не всё то Windows, что висит!
Ответ отправил: Schmak (статус: Студент)
Отправлен: 29.12.2005, 16:48
Отвечает: Diman_A
Здравствуйте, Sassoft!
Я в своем проекте делал регистрацию, опираясь на то, имя файла передается через параметр.
Вот приложение, которое при нажатии одной кнопки регистрирует ассоциирует тип 'test' с собой, а принажатии второй снимает регистрацию:
unit Unit1;
interface
uses Windows, Forms, Registry, Controls, StdCtrls, Classes, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
public
procedure RegisterFileType(ext: string; FileName: string);
end;
var
Form1: TForm1;
reg:TRegistry;
implementation
{$R *.dfm}
procedure TForm1.RegisterFileType(ext: string; FileName: string);
var
reg: TRegistry;
begin
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_CLASSES_ROOT;
OpenKey('.'+ext,True);
WriteString('',ext+'file');
CloseKey;
CreateKey(ext+'file');
OpenKey(ext+'fileDefaultIcon',True);
WriteString('',FileName+',0');
CloseKey;
OpenKey(ext+'fileshellopencommand',True);
WriteString('',FileName+' "%1"');
CloseKey;
Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if ParamCount>0 then
richedit1.Lines.LoadFromFile(ParamStr(1));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Register new file type
registerfiletype ('test', application.ExeName)
end;
procedure TForm1.Button2Click(Sender: TObject);
//Remove registration
begin
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_CLASSES_ROOT;
DeleteKey('.test');
Free;
end;
end;
end.
Ответ отправил: Diman_A (статус: 2-ой класс)
Отправлен: 29.12.2005, 17:33
Отвечает: CJ
Здравствуйте, Sassoft!
Ну вприниципе добавить нечего. Все эксперты замечательно все описали. Единственно могу добавить, что необходимо протестить по разными операционками и необходимо проработать разные варианты: например вручную удалить ключи и проассоциировать заново, либо проассоциировать с другой программой, а потом своей. Вобщем что-бы не возникло разнообразных проблем, необходимо тестить в разных вариантах. А то как я делал, становился нередко на грабли с этой ассоциацией.
Ответ отправил: CJ (статус: Практикант)
Отправлен: 29.12.2005, 21:01
Вопрос № 32.392
Здравствуйте! С наступающим Новым Годом!
Нужно отловить запуск приложения и закрыть его.
Вот так происходит закрытие по заголовку:
PostMessage(FindWindow(Nil, 'Заголовок окна'), WM_QUIT, 0, 0);
Но как узнать когда это приложение появилось?
Отвечает: Ерёмин Андрей
Здравствуйте, SuperXakep!
Если окно существует, то функция FindWindow() возвратит его handle, который будет больше нуля. Этим и следует воспользоваться. Отловить момент, когда приложение запустилось, достаточно сложно, поэтому проще пытаться его закрыть через определённые интервалы времени, по таймеру (TTimer):
procedure TForm1.Timer1Timer(Sender: TObject); begin if FindWindow(Nil,'Заголовок окна') > 0 then PostMessage(FindWindow(Nil,'Заголовок окна'),
WM_QUIT, 0, 0); end;
Не забудьте активировать таймер (Enabled:=True) и установить нужный интервал времени (Interval).
--------- Работа - не волк, а произведение силы на расстояние!
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 29.12.2005, 18:26 Оценка за ответ: 5
Отвечает: Лучников Юрий Владимирович
Здравствуйте, SuperXakep!
Используйте стандартный компонент Timer. В обработчике OnTimer пропишите код, который будет выявлять, присутствует ли окно в системе с помощью FindWindow. Если окно присутствует - послать Message на его закрытие;)
Успехов!
Ответ отправил: Лучников Юрий Владимирович (статус: 8-ой класс)
Отправлен: 29.12.2005, 18:30 Оценка за ответ: 5
Отвечает: sir henry
Здравствуйте, SuperXakep!
Нужно завести таймер и через интервал времени, определяемый таймером, запускать FindWindow() с нужным Вам заголовком. Если функция возвратила хэндл окна, тогда закрыть, иначе ждать следующей провкеруи.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 30.12.2005, 02:28
Вопрос № 32.402
Здравствуйте!
У меня Delphi 2005, создаю я форму и ставлю её значение Visible := False, но при запуске форму всё равно видно! Как сделать что бы формы не было видно??
И ещё вопрос: как скрыть приложение от диспетчера задач?
Отвечает: CJ
Здравствуйте, SuperXakep!
В обработчик FormCreate пропиши строку Application.ShowMainForm:=false;
В приложение пример того, как это делается в D7, в 2005 аналогично.
Приложение:
Ответ отправил: CJ (статус: Практикант)
Отправлен: 29.12.2005, 21:14
Отвечает: Ерёмин Андрей
Здравствуйте, SuperXakep!
Свойство Visible для форм не действует. Скрыть форму можно так:
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 29.12.2005, 21:53 Оценка за ответ: 5
Отвечает: sir henry
Здравствуйте, SuperXakep!
1) Visible:=False в OnCreate этого окна. Наверно оно определено у Вас как главное, поэтому по умолчанию создается видимым. Или вообще не создавать его при запуске. Меню Project - Options и там убрать окно из Auto-create forms. Только когда оно Вам будет нужно - не забудте его создать.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 30.12.2005, 02:33
Отвечает: Diman_A
Здорово, SuperXakep!
Твой супер-Delphi 2005 тут ни при чем: я сижу по delphi 5 и 6, там то же самое,
ведь форма - это и есть форма, а не батон какой-нибудь. Чтобы формы действительно не было видно, надо в самом проекте (файл *.dpr) после строчки Application.Initialize; написать
application.ShowMainForm:=false;
После этого твоя прога исчезнет с экрана и с панели задач. Закрыть можно либо из delphi (CTRL+F2), либо из Диспетчера задач.
По поводу самого диспетчера писать я тебе не буду, ответ найдешь на
http://delphiworld.narod.ru/base/app_xp_hide.html
Ответ отправил: Diman_A (статус: 2-ой класс)
Отправлен: 30.12.2005, 06:18
Отвечает: Ballon
Здравствуйте, SuperXakep!
Попробуй так:
Form1.Hide;
--------- Хочу все знать...
Ответ отправил: Ballon (статус: 7-ой класс)
Отправлен: 30.12.2005, 09:01
Отвечает: Denisss Здравствуйте, SuperXakep!
Про то, как спрятать форму Вам ответ уже дали. А вот про то, как спрятать приложение от диспетчера задач была статья на wasm.ru.
Учитывая, что почему-то этот сайт у меня сейчас не открывается (не знаю в чем дело, но не исключаю, что может сам где-то его блокирую), то прикрепляю Вам эту статью в файл.
Пример "как спрятать Winlogon.exe из процессов" лежит в архиве prochide.rar
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
Ответ отправил: Denisss (статус: Специалист)
Отправлен: 30.12.2005, 10:53
Отвечает: Toxic~Fire
Здравствуйте, SuperXakep!
можно так
form1.left:=screen.width;
и, чтобы форму не засекли, когда поменяют разрешение экрана, напиши:
procedure WMDisplayChange(var message: TMessage); message WM_DISPLAYCHANGE;
...
procedure TForm1.WMDisplayChange(var message: TMessage);
begin
form1.left:=screen.width;
inherited;
end;
она уйдет за пределы экрана.
Но попробуй лучше написать консольное приложение.
А скрыть из диспетчера задач у меня есть пример только на C++
Удачи
Ответ отправил: Toxic~Fire (статус: 1-ый класс)
Отправлен: 30.12.2005, 12:41