Форум » [x]Harbour » Как вернуться в задачу ? » Ответить

Как вернуться в задачу ?

Dima: Есть необходимость из задачи на Clipper ,запускать задачу на Harbour (Xharbour) с WVT терминалом и после закрытия задачи на Harbour обратно возвращаться в задачу на Clipper. Реализуемо ли это ? Если да то как ? Спасибо !

Ответов - 10

Andrey: Dima пишет: обратно возвращаться в задачу на Clipper Т.е. задача на Клипере остается еще запущенной ? 1) Если да, то передавай в программу терминалки-WVT имя Клиперной задачи. 2) Перед окончанием Харборовской задачи определи ID-окна Клиперной задачи. 3) Переключись в Харборной задачи на Окно Клиперной задачи MAXIMIZE(hWindowMain) и выход в Харборе. Смотри пример: \MiniGUI\SAMPLES\Advanced\RunTasks\TaskTest.prg

Dima: Andrey пишет: Т.е. задача на Клипере остается еще запущенной ? Да ;) Это ведь DOS приложение и в процессах висит как NTVDM , PID у них разный если запущена не одна задача. А вообще ноги растут из этой темы Вызывать DOS просмотровщик можно ,но тут могут быть глюки.......уже пощупал. Вот и хотелось вызывать свою задачу на Harbour (WVT) с передачей параметров которая картинку и покажет а после закрытия оной дочерний процесс (задача на Harbour) закроется и я снова окажусь в задаче на Clipper. Чую спинным мозгом что реально это сделать. PS Умельцы еще 8 лет назад написали малюсенькую прогу под вынь которая позволяет запустить нужный NLM модуль на Netware серваке даже если там не загружен модуль remote console. Уверен что и тут решение должно быть

Andrey: А чем мое решение не подходит ? Как искать окно по названию программы - смотри утилитку на хХарборе http://files.mail.ru/KJYLQR


Dima: Andrey Да похоже это работает. Вот только медленно происходит перебор всех окон для поиска нужного. Ускорить бы ;) Окна перебираю до тех пор пока нужное не найду , но 2-3 секунды на это уходит. PS насчет ntvdm и pid я погорячился ;)

Dima: Dima пишет: Ускорить бы ;) Ага ;) Перебирать все окна как бы и не нужно , начиная с первого. Было перед циклом опроса окон hWnd := GetWindow( GetForegroundWindow(), GW_HWNDFIRST ) а нужно hWnd := GetWindow( GetForegroundWindow(), GW_HWNDPREV ) Но есть еще один глючок или это фича такая...... задача на CLipper - родительский процесс (РП) задача на Harbour которую вызвает задача на Clipper - дочерний процесс (ДП) Запускаю РП который запускает ДП , далее я сворачиваю все окна и переключаюсь скажем на браузер. А затем переключаюсь на ДП и закрываю его , после этого в окно РП не попадаю.

Andrey: Dima пишет: Ускорить бы ;) Окна перебираю до тех пор пока нужное не найду , но 2-3 секунды на это уходит. Может С-ную функцию добавить на Клипер, чтоб в задачу на Харборе передавать сразу ID-окна клиперной задачи ? Быстрей будет ! А может написать функцию без перебора (для Харбора), чтобы по заголовку окна - возвращал ID-окна ?

Dima: Andrey пишет: Может С-ную функцию добавить на Клипер, чтоб в задачу на Харборе передавать сразу ID-окна клиперной задачи ? Быстрей будет ! Я уже переделал , работает нормально. Вот только в окно нужное попасть не могу ;))) (читай выше) Dima пишет: А затем переключаюсь на ДП и закрываю его , после этого в окно РП не попадаю.

AlexMyr: Dima пишет: Но есть еще один глючок или это фича такая...... задача на CLipper - родительский процесс (РП) задача на Harbour которую вызвает задача на Clipper - дочерний процесс (ДП) Запускаю РП который запускает ДП , в этом месте ищется окно РП ? Dima пишет: далее я сворачиваю все окна и переключаюсь скажем на браузер. А затем переключаюсь на ДП и закрываю его или после закрытия?

Dima: AlexMyr пишет: в этом месте ищется окно РП ? Да хендл окна , тут все работает нормально. AlexMyr пишет: или после закрытия? Дочернее окно закрыл и в родительское не попал. А вот если ни чего лишнего не клацать и просто завершить дочерний процесс по ESC то в родительское окно попадаю , даже если сама задача находилась в полноэкранном режиме.

Dima: AlexMyr Хендл ищу так (пока не причесывал еще функцию) [pre2] Func Findmyprog() local ret:=0 local ctitle:="" LOCAL hWnd := GetWindow( GetForegroundWindow(), GW_HWNDPREV ) WHILE hWnd != 0 // Loop through all the windows if !empty(cTitle := GetWindowText( hWnd )) if "SKLAD.EXE"$upper(ctitle) ret:=hwnd exit endif endif hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO return ret [/pre2] Хотя наверное достаточно и так сделать [pre2] Func Findmyprog() return GetWindow( GetForegroundWindow(), GW_HWNDPREV ) [/pre2] Это я ищу в ДП и затем перед тем как его закрыть делаю MAXIMIZE( hWindowMain ) //hWindowMain - хендл Clipper задачи (РП) quit



полная версия страницы