Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Мессага одной программы для другой


Автор: Sniper 4.4.2004, 11:31
Вообщем такая ситуация....
работает одна прога (№1). В ней нажимается кнопка и загружается другая прога(№2), а программа (№1) сворачивается в TaskBar.... Далее, поработали с программой (№2) и в ней уже нажимаем кнопку и должно произойти следующее: программа №2 должна закрыться вернув при этом из TaskBar'a программу №1
Вопрос. как это всё реализовать? в смысле через посылку каких сообщений?

Автор: p0s0l 4.4.2004, 12:18
Можно попробовать так:

Прога №1
Код
procedure TForm1.Button1Click(Sender : TObject);
var
 si  : STARTUPINFO;
 pi : PROCESS_INFORMATION;
begin
 < настройка si >;
 CreateProcess(...); // запуск проги №2
 ShowWindow(Handle, SW_MINIMIZE); // в таскбар сворачиваем №1
 WaitForSingleObject(pi.hProcess, INFINITE); // ждём завершения проги №2
 ShowWindow(Handle, SW_SHOWNORMAL); // разворачиваем прогу №1
end;

В проге №2 на кнопку надо повесить завершение этой проги...

Автор: Alex 4.4.2004, 12:37
Почитай здесь http://forum.vingrad.ru/index.php?showtopic=20522&hl=

Автор: Sniper 4.4.2004, 13:07
p0s0l
Я решил использовать вместо CreateProcess - ShellExecute... Я не много потерял? smile.gif
И ещё самое главное это то, что у меня OpenGL приложение, написанное на чистом WINAPI tounge.gif
И там Handle окна прописывается вот так:
h_wnd: HWND;
и сворачивание НЕ происходит! sad.gif

Автор: pascal 5.4.2004, 02:14
Цитата
вместо CreateProcess - ShellExecute... Я не много потерял?

Много...

Цитата
и сворачивание НЕ происходит!

Application.Minimize;
Application.Restore;

Цитата
h_wnd: HWND;

HWND это тот же самый THandle

Цитата
написанное на чистом WINAPI

Не важно как написано

Автор: p0s0l 5.4.2004, 07:06
Цитата
Не важно как написано

Ну если у него чисто WinAPI, никаких uses Forms, то Application.Minimize делать нельзя, т.к. нет никакого Application...
Цитата
Цитата 
вместо CreateProcess - ShellExecute... Я не много потерял?

Много...

Да. У тебя нет handle процесса второй проги (хотя можно его получить и без CreateProcess, но зачем лишний геморрой).
Если же не дожидаться завершения второй проги, тогда придется делать сообщения по примеру alex-co. Правда способ будет побольше.

Автор: p0s0l 5.4.2004, 12:51
Вот пример: прога №1 запускает калькулятор (прога №2) и прога №1 сворачивается; после того, как калькулятор закрыли, прога №1 обратно разворачивается...
Код
procedure Messages; // Вместо Application.ProcessMessages;
var Msg: TMsg;
begin
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 si : STARTUPINFO;
 pi : PROCESS_INFORMATION;

begin
 h_wnd := Handle;
 SendMessage(h_wnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
 Messages;

 ZeroMemory(@si, SizeOf(si));
 si.cb := SizeOf(si);
 CreateProcess('c:\windows\system32\calc.exe',
                nil,
                nil,
                nil,
                False,
                0,
                nil,
                nil,
                si,
                pi);

 WaitForSingleObject(pi.hProcess, INFINITE);

 PostMessage(h_wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
 SetForegroundWindow(h_wnd);
end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)