Vopros po Delphi

User avatar
Jolka
Уже с Приветом
Posts: 526
Joined: 08 Mar 2001 10:01
Location: USA

Vopros po Delphi

Post by Jolka »

Привет!
У меня вопрос. Нужно написать на Delphi код который, когда нажимаеш на кнопку, запускает external program (например, Internet Explorer). Для етого используется ShellExecute command. Но вот что происходит: каждый раз когда кнопка нажимается появляется новый instance программы. Как сделать чтобы, если программа уже запущена, то в етом случае просто переключиться на нее, а не запускать ее опять с нуля.
Я надеюсь, кто нибудь может что-нибудь мне подсказать.Спасибо!
User avatar
IA72
Уже с Приветом
Posts: 956
Joined: 04 Mar 2002 10:01

Re: Vopros po Delphi

Post by IA72 »

Jolka wrote:Привет!
У меня вопрос. Нужно написать на Delphi код который, когда нажимаеш на кнопку, запускает external program (например, Internet Explorer). Для етого используется ShellExecute command. Но вот что происходит: каждый раз когда кнопка нажимается появляется новый instance программы. Как сделать чтобы, если программа уже запущена, то в етом случае просто переключиться на нее, а не запускать ее опять с нуля.
Я надеюсь, кто нибудь может что-нибудь мне подсказать.Спасибо!


После запуска по полученному handle найти главное окно нового приложения, запомнить его имя и класс, при повторном нажатии поискать окно с тем же именем и классом. Delphi специфики никаой, чисто win api.
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

А если вторая программа уже работала до первого нажатия кнопки?

Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)

(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)
User avatar
IA72
Уже с Приветом
Posts: 956
Joined: 04 Mar 2002 10:01

Post by IA72 »

Sergey___K wrote:А если вторая программа уже работала до первого нажатия кнопки?

Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)

(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)


Для этого надо уже знать класс окна (хардкодить придется). Тем более, если их несколько одинакового класса, у вас сколько IE запущено?. Заточить под конкретный тип (IEFrame) конечно можно но некрасиво, тем более что в IE текст окна не URL а document.title.
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

IA72 wrote:
Sergey___K wrote:А если вторая программа уже работала до первого нажатия кнопки?

Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)

(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)


Для этого надо уже знать класс окна (хардкодить придется). Тем более, если их несколько одинакового класса, у вас сколько IE запущено?. Заточить под конкретный тип (IEFrame) конечно можно но некрасиво, тем более что в IE текст окна не URL а document.title.
Ничего некрасивого в хардкоденье и заточку под конкретный тип не вижу, если это надо. Нсколько я понял, там заранее известно, что за прога и особо оно меняться не будет. А вообще, как альтернатива, если прога есть OLE automation server (Весь MS Office, IE ....) то, GetObject/CreateObject. (ну или что там в дельфях).
User avatar
IA72
Уже с Приветом
Posts: 956
Joined: 04 Mar 2002 10:01

Post by IA72 »

Sergey___K wrote:
IA72 wrote:
Sergey___K wrote:А если вторая программа уже работала до первого нажатия кнопки?

Короче, "шерше окно": хэндл=FindWindow(....);
Дальше, SetForegroundWindow(хэндл);
(и ShowWindow(хэндл, SW_RESTORE); на случай если свернутое было.)

(Hint: Если та, вторая прога тоже в дельфях сделана, то у нее класс окна будет TApplication. Гм. Кажется)


Для этого надо уже знать класс окна (хардкодить придется). Тем более, если их несколько одинакового класса, у вас сколько IE запущено?. Заточить под конкретный тип (IEFrame) конечно можно но некрасиво, тем более что в IE текст окна не URL а document.title.
Ничего некрасивого в хардкоденье и заточку под конкретный тип не вижу, если это надо. Нсколько я понял, там заранее известно, что за прога и особо оно меняться не будет. А вообще, как альтернатива, если прога есть OLE automation server (Весь MS Office, IE ....) то, GetObject/CreateObject. (ну или что там в дельфях).


Еще раз - у вас есть 5 окон IE. Как вы зная только класс будете искать нужный? А если файл .txt попадется? Ведь в условии сказано - ShellExecute, то есть запуск ассоциированной программы. К примеру, MyIE а не IE.
Хардкодение практически всегда не только некрасиво, но и ненадежно.
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

To Jolka:
Вы можете конкретно поставить вопрос. Что за прога и чего в ней есть.
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

Хардкодение практически всегда не только некрасиво, но и ненадежно
А про "всегда" никто и не говорит.
User avatar
Jolka
Уже с Приветом
Posts: 526
Joined: 08 Mar 2001 10:01
Location: USA

Post by Jolka »

Спасибо большое всем за ответы!!
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;
User avatar
IA72
Уже с Приветом
Posts: 956
Joined: 04 Mar 2002 10:01

Post by IA72 »

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 использую. И что теперь, как работать будет?
User avatar
Jolka
Уже с Приветом
Posts: 526
Joined: 08 Mar 2001 10:01
Location: USA

Post by Jolka »

Sergey___K wrote:To Jolka:
Вы можете конкретно поставить вопрос. Что за прога и чего в ней есть.

Ето программа которая запускает приложения. В етом случае, ето приложения которые позволяют manage your media (cds, videos, mp3s, etc). Demo просто смотрит запушчено приложение уже или нет и переключается в него. Полностью код программы ешче не написан на данный момент..

Return to “Вопросы и новости IT”