Страница 1 из 1
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 14:34
kreator
Открываю файлы Shellexecute'ом. Параметр nShowCmd выставляю "SW_SHOW". Много экспериментировал со значениями этого параметра. И вроде с "SW_SHOW" всё более-менее. Но иногда (причём не всегда) управление не передаётся в программу, которой открывается файл. Такая ситуация, например, с Excel. Если он открыт, то мой файл открывается в "minimize" режиме. Приходится явно кликать на иконку Экселя на панели задач. Что можно сделать, чтобы гарантированно Экселю передалось управление? Параметру nShowCmd другое значение дать? Какое?
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 15:00
Yufil
Дело в том, что пока Ёксель запускается,запускающее приложение становится активным.
Совсем простейший вариант
Код: Выделить всё
Wait WINDOW,AT(,,145,26),CENTER,GRAY,FONT('Microsoft Sans Serif',8), |
COLOR(0DCF8FFH)
STRING('Подождите немного...'),AT(2,8,141,15),USE(?STRING1),CENTER, |
FONT('Arial',11,,FONT:bold+FONT:italic)
END
....
Open(wait)
Display()
SetCursor(Cursor:Wait)
Shellexecute(....)
Close(Wait)
SetCursor
В простейшем случае вполне достаточно
Если и тут проблема - крутимся дальше - после открытия окна ждём, когда его перекроют, а потом закрываемся
Код: Выделить всё
open(Wait)
Wait{Prop:Timer}=500
SetCursor(Cursor:Wait)
Accept
Case Event()
Of Event:OpenWindow
Shellexecute(....)
Of Event:LoseFocus Orof Event:Timer
Break
End
End
Close(Wait)
SetCursor
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 15:02
Дед Пахом
Можно ещё посмотреть в сторону ShellExecuteEx и флага SEE_MASK_NOASYNC.
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 16:53
kreator
Yufil писал(а): 16 Июнь 2017, 15:00
Дело в том, что пока Ёксель запускается,запускающее приложение становится активным.
Не понял. Я из своего окна (которое не собираюсь закрывать) просто вызываю ShellExecute, а ShellExecute запускает Excel. Если Excel не запущен уже, то всё хорошо - Excel открывается (не быстро) и остаётся поверх всех окон. А вот, если он уже запущен, то файл открывается без проблем, но на само окно Excel переключения может и не произойти. Ещё заметил, что, если окно Excel явно минимизировано, то переключение на окно Excel всегда есть. Может я парюсь? Всё зависит от компа и конкретной Винды? Семёрка группирует открытые окна одного приложения, может в этом какой-то эффект?
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 18:01
finsoftrz
От винды зависимость точно есть. Скорее всего, приложение что-то делает после запуска Excel. Например, select или шлет событие какому-то контролу. Был вопрос. Решилось, когда все подобные движения были перенесены перед вызовом Excel.
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 19:09
Yufil
Это может происходить с любой версией операционной системы и обсуждалось миллион раз..
Я нажал на кнопку, чтобы вызвать Excel. Запустил ShellExecure, после чего обработка событий кнопки закончилась. На текущем экране происходит какое-то событие (например, Event:GainFocus или Event:Timer) и экран (вместе с ним и приложение) становится активным. А Excel, соответственно, нет.
Есть ещё пара соображений, которые могут помочь. Может быть, и этого хватит
1. В ShellExecute в качестве первого параметра передаётся Handle текущего окна, надо передать 0.
2. Перед вызовом ShellExecute вызвать функцию UnlockThread(), а после - LockThread().
Но, вообще-то открытие окна ожидания смотрится весьма приятно. В принципе, можно его размеры уменьшить до 1x1 или 0x0 и оно никому мешать не будет
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 19:22
finsoftrz
В разных версиях виндов один и тот же код программы отрабатывал по разному. Сейчас точно уже не помню, может, еще со времен windows 98 засело, в которой другая событийная модель. Но мне кажется, что было разное поведение и на windows xp и windows 2003 server. Сейчас на windows 7 проблемы с переключением на excel у меня не возникает, специально для этого никаких телодвижений не делаю. А также на Win2003, Win2008 - из того, что под рукой и могу проверить...
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 20:21
kreator
Yufil писал(а): 16 Июнь 2017, 19:09
1. В ShellExecute в качестве первого параметра передаётся Handle текущего окна, надо передать 0.
Да, передаю ноль.
Yufil писал(а): 16 Июнь 2017, 19:09
2. Перед вызовом ShellExecute вызвать функцию UnlockThread(), а после - LockThread().
Попробую, хотя и сомневаюсь в успехе.
Yufil писал(а): 16 Июнь 2017, 19:09
Но, вообще-то открытие окна ожидания смотрится весьма приятно. В принципе, можно его размеры уменьшить до 1x1 или 0x0 и оно никому мешать не будет
Попробовать открыть промежуточное окно?
finsoftrz писал(а): 16 Июнь 2017, 19:22
Сейчас на windows 7 проблемы с переключением на excel у меня не возникает, специально для этого никаких телодвижений не делаю.
Систему пока не пойму, то переключается, то нет.
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 21:29
gopstop2007
Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 21:44
Yufil
>> Попробовать открыть промежуточное окно?
Дык, а я о чём? Как раз привожу примеры, когда открыается промежуточное Non-MDI окно без активных элементов вообще, а с него стартуется Ёксель...
>> Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
Какого окна?
Снова ShellExecute.
Добавлено: 16 Июнь 2017, 22:09
gopstop2007
Yufil писал(а): 16 Июнь 2017, 21:44
>> Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
Какого окна?
Может я чего то не понял, "поднять" - обратится к окну Excel.
Код: Выделить всё
cWindowText = 'Имя окна'
cClassName = 'TMainForm'
hwndMain = FindWindow(cClassName,cWindowText) ! Находим окно
IF hwndMain > 0
hwnd = GetWindow(hwndMain,GW_CHILD)
ELSE
! MESSAGE('Окно не найдено Запустите программу!')
END
! обратится к окну
SendMessage(hwnd,WM_IME_KEYDOWN,EnterKey,0) ! прыгнуть на окно по адресу
Снова ShellExecute.
Добавлено: 17 Июнь 2017, 11:45
kreator
gopstop2007 писал(а): 16 Июнь 2017, 22:09
Может я чего то не понял, "поднять" - обратится к окну Excel.
Не вариант. Excel вообще для примера, просто сейчас сложную диаграмму там рисую и столкнулся. А так, например, у нас фотки открываются во внешних программах. Возможно, в разных на разных компах. Для просмотра PDF - куча средств. Невозможно контролировать всё. И не контролирую, полагаюсь на ShellExecute.