Привет!
У меня вопрос. Нужно написать на Delphi код который, когда нажимаеш на кнопку, запускает external program (например, Internet Explorer). Для етого используется ShellExecute command. Но вот что происходит: каждый раз когда кнопка нажимается появляется новый instance программы. Как сделать чтобы, если программа уже запущена, то в етом случае просто переключиться на нее, а не запускать ее опять с нуля.
Я надеюсь, кто нибудь может что-нибудь мне подсказать.Спасибо!
Vopros po Delphi
-
- Уже с Приветом
- Posts: 956
- Joined: 04 Mar 2002 10:01
Re: Vopros po Delphi
Jolka wrote:Привет!
У меня вопрос. Нужно написать на Delphi код который, когда нажимаеш на кнопку, запускает external program (например, Internet Explorer). Для етого используется ShellExecute command. Но вот что происходит: каждый раз когда кнопка нажимается появляется новый instance программы. Как сделать чтобы, если программа уже запущена, то в етом случае просто переключиться на нее, а не запускать ее опять с нуля.
Я надеюсь, кто нибудь может что-нибудь мне подсказать.Спасибо!
После запуска по полученному handle найти главное окно нового приложения, запомнить его имя и класс, при повторном нажатии поискать окно с тем же именем и классом. Delphi специфики никаой, чисто win api.
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
А если вторая программа уже работала до первого нажатия кнопки?
Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)
(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)
Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)
(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)
-
- Уже с Приветом
- Posts: 956
- Joined: 04 Mar 2002 10:01
Sergey___K wrote:А если вторая программа уже работала до первого нажатия кнопки?
Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)
(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)
Для этого надо уже знать класс окна (хардкодить придется). Тем более, если их несколько одинакового класса, у вас сколько IE запущено?. Заточить под конкретный тип (IEFrame) конечно можно но некрасиво, тем более что в IE текст окна не URL а document.title.
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
Ничего некрасивого в хардкоденье и заточку под конкретный тип не вижу, если это надо. Нсколько я понял, там заранее известно, что за прога и особо оно меняться не будет. А вообще, как альтернатива, если прога есть OLE automation server (Весь MS Office, IE ....) то, GetObject/CreateObject. (ну или что там в дельфях).IA72 wrote:Sergey___K wrote:А если вторая программа уже работала до первого нажатия кнопки?
Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)
(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)
Для этого надо уже знать класс окна (хардкодить придется). Тем более, если их несколько одинакового класса, у вас сколько IE запущено?. Заточить под конкретный тип (IEFrame) конечно можно но некрасиво, тем более что в IE текст окна не URL а document.title.
-
- Уже с Приветом
- Posts: 956
- Joined: 04 Mar 2002 10:01
Sergey___K wrote:Ничего некрасивого в хардкоденье и заточку под конкретный тип не вижу, если это надо. Нсколько я понял, там заранее известно, что за прога и особо оно меняться не будет. А вообще, как альтернатива, если прога есть OLE automation server (Весь MS Office, IE ....) то, GetObject/CreateObject. (ну или что там в дельфях).IA72 wrote:Sergey___K wrote:А если вторая программа уже работала до первого нажатия кнопки?
Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)
(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)
Для этого надо уже знать класс окна (хардкодить придется). Тем более, если их несколько одинакового класса, у вас сколько IE запущено?. Заточить под конкретный тип (IEFrame) конечно можно но некрасиво, тем более что в IE текст окна не URL а document.title.
Еще раз - у вас есть 5 окон IE. Как вы зная только класс будете искать нужный? А если файл .txt попадется? Ведь в условии сказано - ShellExecute, то есть запуск ассоциированной программы. К примеру, MyIE а не IE.
Хардкодение практически всегда не только некрасиво, но и ненадежно.
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
-
- Уже с Приветом
- Posts: 526
- Joined: 08 Mar 2001 10:01
- Location: USA
Спасибо большое всем за ответы!!
Vot chto poluchilos' i rabotajet. It iterates through all windows and looks for outlook express. If it finds it, it then switches to it.
procedure TForm1.Button1Click(Sender: TObject);
var
Dest: array[0..80] of char;
i: integer;
begin
try
WindowList := TList.Create;
EnumWindows(@GetWindows, Longint(@TopWindow));
for i := 0 to WindowList.Count - 1 do
begin
GetWindowText(HWND(WindowList[i]), Dest, sizeof(Dest) - 1);
memo1.Lines.Add(Dest);
if (StrLen(Dest) > 0) AND (Pos('Outlook Express',Dest)<>0) then
begin
Showmessage('window found');
SetForeGroundWindow(HWND(WIndowList[i]));
end;
end;
finally
WindowList.Free;
end;
end;
Vot chto poluchilos' i rabotajet. It iterates through all windows and looks for outlook express. If it finds it, it then switches to it.
procedure TForm1.Button1Click(Sender: TObject);
var
Dest: array[0..80] of char;
i: integer;
begin
try
WindowList := TList.Create;
EnumWindows(@GetWindows, Longint(@TopWindow));
for i := 0 to WindowList.Count - 1 do
begin
GetWindowText(HWND(WindowList[i]), Dest, sizeof(Dest) - 1);
memo1.Lines.Add(Dest);
if (StrLen(Dest) > 0) AND (Pos('Outlook Express',Dest)<>0) then
begin
Showmessage('window found');
SetForeGroundWindow(HWND(WIndowList[i]));
end;
end;
finally
WindowList.Free;
end;
end;
-
- Уже с Приветом
- Posts: 956
- Joined: 04 Mar 2002 10:01
Jolka wrote:Спасибо большое всем за ответы!!
Vot chto poluchilos' i rabotajet. It iterates through all windows and looks for outlook express. If it finds it, it then switches to it.
if (StrLen(Dest) > 0) AND (Pos('Outlook Express',Dest)<>0) then
А я вот просто Outlook использую. И что теперь, как работать будет?
-
- Уже с Приветом
- Posts: 526
- Joined: 08 Mar 2001 10:01
- Location: USA
Sergey___K wrote:To Jolka:
Вы можете конкретно поставить вопрос. Что за прога и чего в ней есть.
Ето программа которая запускает приложения. В етом случае, ето приложения которые позволяют manage your media (cds, videos, mp3s, etc). Demo просто смотрит запушчено приложение уже или нет и переключается в него. Полностью код программы ешче не написан на данный момент..