Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
-ATT-
57 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 49
#1

Запуск одной программы в несколько окон - Delphi

28.07.2013, 19:42. Просмотров 2438. Ответов 15
Метки нет (Все метки)

Добрый день! Не знаю как коротко сформулировать вопрос для поисковика.
Есть программа telnet.exe , нужно запускать ее с разными параметрами в несколько окон, потом контролировать чтоб клиент был подключен (при отключении делать перезапуск программы), а как это делать, если имена процессов будут у всех окон одинаковые?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2013, 19:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запуск одной программы в несколько окон (Delphi):

Закрыть несколько окон одной программы
вот как я пробовал делать (на примере IE): procedure TForm1.CloseWindow; var ...

Несколько окон в одной форме
В общем, обыскал интернет, никак не могу найти такой вот ситуации. Мне нужно...

Как разместить несколько редактируемых окон на одной форме?
Нужно разместить несколько редактируемых записей на одном окне, чтобы можно...

Запретить второй запуск программы. Приложение без окон
Сабж. Без подключения в uses компонента формы. Все примеры что находил в инете...

Несколько окон с одной программы
Hi. Help! Когда стартую Дельфи (V7) то автоматически появляеться окно...

Как удалить ссылку на запуск программы при удалении программы
Всем привет! Для установки - удаления программ использую такие пакеты как...

15
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
28.07.2013, 20:15 #2
Хэндлы процессов разные.
1
-ATT-
57 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 49
28.07.2013, 20:52  [ТС] #3
Цитата Сообщение от mss Посмотреть сообщение
Хэндлы процессов разные.
Спасибо. А для получения handle что лучше всего использовать? GetWindow подойдет?
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
28.07.2013, 20:58 #4
Цитата Сообщение от -ATT- Посмотреть сообщение
GetWindow подойдет?
Не подойдет совершенно.
GetWindowThreadProcessId подошел бы, но заголовки у окон одинаковые, не представляю как ты будешь отличать одно окно от другого.

Цитата Сообщение от -ATT- Посмотреть сообщение
контролировать чтоб клиент был подключен
Это делается не на уровне окон, а именно на уровне контролируемого запуска процесса и контролируемого ввода-вывода, ассоциированного с этим процессом.

Плясать следует от CreateProcess
0
саша40
-10 / 287 / 47
Регистрация: 14.08.2012
Сообщений: 2,522
29.07.2013, 07:31 #5
-ShellExecute
-Не нет, не слышал!
Юзай
1
mss
29.07.2013, 09:19
  #6

Не по теме:

Цитата Сообщение от саша40 Посмотреть сообщение
-ShellExecute
-Не нет, не слышал!
Юзай
Опять буквы знакомые увидел ?)

0
-ATT-
57 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 49
29.07.2013, 11:55  [ТС] #7
Если я делаю вот так:
Delphi
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShellExecute (Form1.Handle, 'open', PChar ('c:\Windows\System32\calc.exe'), nil, nil, SW_RESTORE);
 Memo1.Lines.Add(IntToStr(Form1.Handle));
end;
То получаю значение Form1.Handle, но теперь два вопроса:
1. Как закрыть программу по нужному мне Form1.Handle?
2. Если запускаю несколько окон, то Form1.Handle не меняется, а меняется только при запуске нового моего исходника.
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
29.07.2013, 12:53 #8
Цитата Сообщение от -ATT- Посмотреть сообщение
1. Как закрыть программу по нужному мне Form1.Handle?
Никак.
Это хендл окна твоей формы, а не хендл окна запущенной тобой внешней программы.

Цитата Сообщение от -ATT- Посмотреть сообщение
2. Если запускаю несколько окон, то Form1.Handle не меняется
С чего бы ему измениться ?
1
-ATT-
57 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 49
30.07.2013, 12:32  [ТС] #9
Цитата Сообщение от mss Посмотреть сообщение
Никак.
Это хендл окна твоей формы, а не хендл окна запущенной тобой внешней программы.
Ну подскажи плз, как при помощи CreateProcess получить хэндл запущеной внешней программы.

Добавлено через 23 часа 31 минуту
В общем вот так реализовал:
Delphi
1
2
3
4
5
6
7
8
9
10
Begin
     CreateProcess(nil,'C:\WINDOWS\system32\calc.exe', nil, nil, False, 0, nil, nil, SI, PI);
     Memo1.Lines.Add(PI.hProcess);
          End;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
TerminateProcess(PI.hProcess, 0);
CloseHandle(PI.hProcess);
end;
Все работает. Может еще чего нужно добавть? Поправьте если что не так.
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.07.2013, 12:52 #10
Ты объясни причем тут calc.exe, если речь в вопросе шла о telnet.exe ?
В любом случае насильно терминировать чужой процесс с пом. TerminateProcess() - это крайняя мера, на случай отстутствия нормальной реакции этого процесса на управляющие сообщения.

Цитата Сообщение от -ATT- Посмотреть сообщение
хэндл запущеной внешней программы
Хендл ее окна ? Тут же вопрос - какого конкретно, если программа создает более одного окна ?
0
-ATT-
57 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 49
30.07.2013, 13:03  [ТС] #11
Цитата Сообщение от mss Посмотреть сообщение
Ты объясни причем тут calc.exe, если речь в вопросе шла о telnet.exe ?
Ну а какая разница, ехе-шник для примера calc.exe, телнет также вроде себя ведет)
Цитата Сообщение от mss Посмотреть сообщение
В любом случае насильно терминировать чужой процесс с пом. TerminateProcess() - это крайняя мера, на случай отстутствия нормальной реакции этого процесса на управляющие сообщения.
Порекомендуй, чем убивать тогда процесс.

Цитата Сообщение от mss Посмотреть сообщение
Хендл ее окна ? Тут же вопрос - какого конкретно, если программа создает более одного окна ?
При каждом новом запуске CreateProcess у меня создается хнндл из трех цифр, потом подставляя их в
TerminateProcess(PI.hProcess, 0);
CloseHandle(PI.hProcess);
я убиваю эти процессы.
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.07.2013, 13:20 #12
Цитата Сообщение от -ATT- Посмотреть сообщение
Ну а какая разница
Большая !

Цитата Сообщение от -ATT- Посмотреть сообщение
чем убивать тогда процесс
Да не надо процесс "убивать" !
Это крайняя надобность, когда процесс не реагирует ни на одну команду из разряда "закругляйся")
А что это конкретно за команда - это зависит от конкретного процесса.
Консольные обычно закругляются при получении адресованного их окнам сообщения WM_CLOSE.
Многие (но далеко не каждое) GUI-приложения так же реагируют на WM_CLOSE.
Единой же универсальной команды на закругление для безоконных приложений не существует в принципе.

Добавлено через 52 секунды
Цитата Сообщение от -ATT- Посмотреть сообщение
каждом новом запуске CreateProcess у меня создается хнндл из трех цифр
Это хендл процесса, а не хендл окна.
1
саша40
-10 / 287 / 47
Регистрация: 14.08.2012
Сообщений: 2,522
02.08.2013, 21:01 #13
тебе нужно искать не хендл внешнего окна(другого приложения как я понял), а хендл процесса. Получаешь его PID с помощью GetProcessID и потом хендл при помощь OpenProcess. Кстати, и какого интересна фига мы лезем в System32 без прав админа?
0
-ATT-
57 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 49
02.08.2013, 21:30  [ТС] #14
Цитата Сообщение от саша40 Посмотреть сообщение
тебе нужно искать не хендл внешнего окна(другого приложения как я понял), а хендл процесса. Получаешь его PID с помощью GetProcessID и потом хендл при помощь OpenProcess. Кстати, и какого интересна фига мы лезем в System32 без прав админа?
А можно для нубов в коде всё это?)
0
саша40
-10 / 287 / 47
Регистрация: 14.08.2012
Сообщений: 2,522
02.08.2013, 21:36 #15
Цитата Сообщение от -ATT- Посмотреть сообщение
А можно для нубов в коде всё это?)
Задай в поиск: "Как создать чит?" и там будет вторая половина кода твой ответ.
0
mss
02.08.2013, 21:47     Запуск одной программы в несколько окон
  #16

Не по теме:

Цитата Сообщение от саша40 Посмотреть сообщение
Получаешь его PID с помощью GetProcessID
GetProcessId, клоун, - это из другой оперы. Но в этой опере буквы тебе знакомые и вправду есть.

Цитата Сообщение от саша40 Посмотреть сообщение
и какого интересна фига мы лезем в System32 без прав админа?
И кто ж тебе, клоун, сказал что кто-то куда-то в какие-то там "System32" собрался "лезть" ?
Очередной фонтан дурацких советов.

1
02.08.2013, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 21:47
Привет! Вот еще темы с ответами:

Запуск внешней программы в форме программы
Всем привет :) может Вы меня и не поймете, но не пинайте, я только учусь :) ...

Запуск одной процедуры из другой
Как из одной процедуры вызвать другую?

Разбиение одной строки на несколько
имеется следующий код текст в нем как можно увидеть в строку заносится целиком...

Несколько действий одной кнопки
Привет всем! подскажите пожалуйста как этот код сделать покороче: begin if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru