Добрый день.
Есть задача: на компакт диске записана информация в html. Нужно, чтобы при запуске компакта автоматом запускался браузер и показывал инфу. Использую ShellExecute.
Проблема: если в момент запуска компакта на экране уже есть открытые браузеры, новое окно не запускается, а информация показывается в уже имеющемся экземпляре.
Как всегда показывать информацию с компакта в новом окне?
Ненавижу и не использую Explorer, но можно сделать так:
ShellExecute(0, '', 'iexplore', '"E:\File.html"', '', SW_SHOWNORMAL);
А лучше
ShellExecute(0,'open','"E:\File.html"','','',SW_SHOWNORMAL);
Тогда откроется файл в браузере по умолчанию.
2 YuRock.
Вся беда в том, что черт его знает, установлен у конечного пользователя ехплорер, или че другое...
2 SeLarin.
Так, собственно, и делаю... а хочется всегда в новом окне. Может, можно как-то запустить браузер, установленный в системе по умолчанию, а потом уже запускать сам файл? Но как запустить браузер по умолчанию?
>>DmitryNekl © (31.03.04 12:27)
Может TWebBrowser спасет отца русской демократии?
А не легче ли скопировать иp директории Windows файл Start.com в корень CD и в aurun.inf прописать start index.htm и не заморачиваться в Delphi
ShellExecute(0,'open','E:\File.html', ...
мне почему-то кажется, что городить программу для запуска автоматом html файла не обязательно. если написать open=index.htm, то это получится и без программы.
другое дело, если программа нужна все равно (тогда autorun здесь не причем абсолютно). проблема понятна, но способа ее решения я не знаю. была идея указать не 'open', а 'opennew' - есть такое действие в списке ассоциаций для .htm, но не заработало почему-то. а вот ICQ открывает ссылки в новом окне. как - самому интересно.
Открываешь блокнот и пишешь
[Autorun]
Open=index.htm
и сохраняешь под именем Autoryn.inf. Потом ложишь в корень CD и при следующем запуске диска автоматом откроется твой файл.
З. Ы. Если написать
[Autorun]
Open=index.htm
Icon=DeadHead.ico
то в проводнике вместо диска откроется иконка, которая на этом же CD называется DeadHead.ico (череп)
Немного не в тему, но не забудьте вместо абсолютного пути "e:/index.html" указывать относительный - "/index.html". Не у всех же Сидюк - диск "E"?
Насчет открытия ШТМЛ в новм окне. С помощью АПИ по-моему никак. Разве только поменять на время работы программы в реестре (к сожалению, не помню где), способ открытия странички...
Я пользуюсь AvantBrowser. Открывает странички в новых окнах ;))
>С помощью АПИ по-моему никак.
ну почему никак. например, определить дефолтный браузер, если это IE, то создать новое окно и навигировать его через OLE, иначе - ShellExecute. муторно только как-то...
>Я пользуюсь AvantBrowser. Открывает странички в новых окнах ;))
ты себе хоть сам браузер напиши. мы о юзере заботимся :)
> а вот ICQ открывает ссылки в новом окне. как - самому интересно.
http://www.swissdelphicenter.ch/torry/showcode.php?id=490uses
ShellAPI, Registry;
procedure OpenURL(Url: string);
var
ts: string;
begin
with TRegistry.Create do
try
rootkey := HKEY_CLASSES_ROOT;
OpenKey('\htmlfile\shell\open\command', False);
try
ts := ReadString('');
except
ts := '';
end;
CloseKey;
finally
Free;
end;
if ts = '' then Exit;
// remove quotes and commandline parameters
ts := Copy(ts, Pos('"', ts) + 1, Length(ts));
ts := Copy(ts, 1, Pos('"', ts) - 1);
ShellExecute(0, 'open', PChar(ts), PChar(url), nil, SW_SHOW);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenURL('http://www.SwissDelphiCenter.ch');
end; uses
DdeMan,
{$IFDEF WIN32}
Registry; {We will get it from the registry}
{$ELSE}
IniFiles; {We will get it from the win.ini file}
{$ENDIF}
{$IFNDEF WIN32}
const
MAX_PATH = 144;
{$ENDIF}
function GetProgramAssociation(Ext: string): string;
var
{$IFDEF WIN32}
reg: TRegistry;
s: string;
{$ELSE}
WinIni: TIniFile;
WinIniFileName: array[0..MAX_PATH] of Char;
s: string;
{$ENDIF}
begin
{$IFDEF WIN32}
s := '';
reg := TRegistry.Create;
reg.RootKey := HKEY_CLASSES_ROOT;
if reg.OpenKey('.' + ext + '\shell\open\command',
False) <> False then
begin
{The open command has been found}
s := reg.ReadString('');
reg.CloseKey;
end
else
begin
{perhaps thier is a system file pointer}
if reg.OpenKey('.' + ext,
False) <> False then
begin
s := reg.ReadString('');
reg.CloseKey;
if s <> '' then
begin
{A system file pointer was found}
if reg.OpenKey(s + '\shell\open\command',
False) <> False then
{The open command has been found}
s := reg.ReadString('');
reg.CloseKey;
end;
end;
end;
{Delete any command line, quotes and spaces}
if Pos('%', s) > 0 then
Delete(s, Pos('%', s), Length(s));
if ((Length(s) > 0) and
(s[1] = '"')) then
Delete(s, 1, 1);
if ((Length(s) > 0) and
(Pos('"', s) > 0)) then
Delete(s, Pos('"', s), Length(s));
while ((Length(s) > 0) and
(s[Length(s)] = #32)) do
Delete(s, Length(s), 1);
{$ELSE}
GetWindowsDirectory(WinIniFileName, SizeOf(WinIniFileName));
StrCat(WinIniFileName, '\win.ini');
WinIni := TIniFile.Create(WinIniFileName);
s := WinIni.ReadString('Extensions',ext,'');
WinIni.Free;
{Delete any command line}
if Pos(' ^', s) > 0 then
Delete(s, Pos(' ^', s), Length(s));
{$ENDIF}
Result := s;
end;
procedure StartNewBrowserWindow(URL: string);
var
DDEConv: TDDEClientConv;
URLFired: bool;
App: string;
UpApp: string;
p: array[0..MAX_PATH] of Char;
begin
UrlFired := False;
App := GetProgramAssociation('HTM');
UpApp := Uppercase(App);
Delete(App, Pos('.EXE', UpAPP), Length(App));
if Pos('NETSCAPE.EXE',
UpApp) > 0 then
begin
DDEConv := TDDEClientConv.Create(nil);
DDEConv.ServiceApplication := App;
if DDEConv.SetLink('NETSCAPE', 'WWW_OpenURL') then
if DDEConv.RequestData(URL + ',,0x0,0x0') <> nil then
if DDEConv.SetLink('NETSCAPE', 'WWW_Activate') then
URLFired := DDEConv.RequestData('0xFFFFFFFF,0x0') <> nil;
DDEConv.Free;
end
else if Pos('IEXPLORE.EXE',
UpApp) > 0 then
begin
DDEConv := TDDEClientConv.Create(nil);
DDEConv.ServiceApplication := App;
if DDEConv.SetLink('iexplore', 'WWW_OpenURL') then
if DDEConv.RequestData(URL + ',,0') <> nil then
if DDEConv.SetLink('iexplore', 'WWW_Activate') then
URLFired := DDEConv.RequestData('0,0') <> nil;
DDEConv.Free;
end;
if UrlFired = False then
WinExec(StrPCopy(@p, URL), SW_SHOWNORMAL);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StartNewBrowserWindow('http://www.borland.com');
StartNewBrowserWindow('http://www.yahoo.com');
end;
>Игорь Шевченко
вон оно как... оказывается ICQ на дельфи написано ;))
первый вариант какой-то дурацкий - берется имя exe, ассоциированного с html, все его параметры фигачатся напрочь, и url передается единственным параметром. а если url неизвестному браузеру должен передаваться не просто как первый параметр, а с каким-то ключом? а если url передается через DDE? наконец, если просто в url присутствует пробел, то будет проблема, мне кажется...
второй вариант потрясает воображение, но вероятно в нем и есть сермяжная правда. если netscape точно также открывал url в старом окне.
ладно. вот мой вариант. интересно будет услышать, как он работает, когда дефолтный браузер - не IE.// (c) nikkie, 2004
procedure OpenBrowser(Handle: HWND; Url: String);
var
CommandLine: String;
IE: OleVariant;
begin
CommandLine := '';
with TRegistry.Create do try
RootKey := HKEY_CLASSES_ROOT;
OpenKey('\http\shell\open\command', False);
try
CommandLine := ReadString('');
finally
CloseKey;
end;
finally
Free;
end;
if Pos('iexplore', CommandLine) > 0 then begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Visible := True;
IE.Navigate(Url);
end else begin
if ShellExecute(Handle, 'open', PChar(Url), nil, nil, SW_SHOWNORMAL) <= 32 then
RaiseLastWin32Error;
end;
end;
ЗЫ кто копирует и публикует код, не сохраняя копирайта, тот редиска и вообще будет тому плохо. :)
nikkie © (02.04.04 01:20)
ICQ вообще-то на С написано. Или на С++.
Если кому интересно, как работает именно ICQ, я в следующий раз буду код на С приводить :P
Кстати, в одном из RSDN Magazine'ов в Q&A (если мне память не изменяет) обсуждается вопрос открытия страницы в новом окне с учетом разных браузеров, под рукой журнала нету.
>в одном из RSDN Magazine'ов в Q&A
если попадется под руку - посмотри. но не думаю, что там открытие какое-то сделано. вот на сайте нашел у них наиболее содержательную тему:
http://www.rsdn.ru/forum/Message.aspx?mid=15289
из новых для меня соображений на эту тему - AssocQueryString (но вроде функционально нового ничего не добавит, зато повышенные требования - должен быть IE5) и параметр EditFlags, на которые там некоторые напирают, только зачем он нужен, я не знаю.
а на второй страничке темы - демонстрация того, что первый код из
http://www.swissdelphicenter.ch/torry/showcode.php?id=490
работает не всегда.
Страница с форумов сайта Мастера Delphi. Оригинал находится здесь. Сохранено клиентом для форума DMClient.