Снова ShellExecute.
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- ✯ Ветеран ✯
- Сообщения: 4960
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 6 раз
- Поблагодарили: 19 раз
Снова ShellExecute.
Открываю файлы Shellexecute'ом. Параметр nShowCmd выставляю "SW_SHOW". Много экспериментировал со значениями этого параметра. И вроде с "SW_SHOW" всё более-менее. Но иногда (причём не всегда) управление не передаётся в программу, которой открывается файл. Такая ситуация, например, с Excel. Если он открыт, то мой файл открывается в "minimize" режиме. Приходится явно кликать на иконку Экселя на панели задач. Что можно сделать, чтобы гарантированно Экселю передалось управление? Параметру nShowCmd другое значение дать? Какое?
We are hard at work… for you.
Снова ShellExecute.
Дело в том, что пока Ёксель запускается,запускающее приложение становится активным.
Совсем простейший вариант
В простейшем случае вполне достаточно
Если и тут проблема - крутимся дальше - после открытия окна ждём, когда его перекроют, а потом закрываемся
Совсем простейший вариант
Код: Выделить всё
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
Последний раз редактировалось Yufil 16 Июнь 2017, 15:07, всего редактировалось 2 раза.
- Дед Пахом
- Старичок
- Сообщения: 3131
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Снова ShellExecute.
Можно ещё посмотреть в сторону ShellExecuteEx и флага SEE_MASK_NOASYNC.
С уважением, ДП
-
- ✯ Ветеран ✯
- Сообщения: 4960
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 6 раз
- Поблагодарили: 19 раз
Снова ShellExecute.
Не понял. Я из своего окна (которое не собираюсь закрывать) просто вызываю ShellExecute, а ShellExecute запускает Excel. Если Excel не запущен уже, то всё хорошо - Excel открывается (не быстро) и остаётся поверх всех окон. А вот, если он уже запущен, то файл открывается без проблем, но на само окно Excel переключения может и не произойти. Ещё заметил, что, если окно Excel явно минимизировано, то переключение на окно Excel всегда есть. Может я парюсь? Всё зависит от компа и конкретной Винды? Семёрка группирует открытые окна одного приложения, может в этом какой-то эффект?
We are hard at work… for you.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4560
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 34 раза
Снова ShellExecute.
От винды зависимость точно есть. Скорее всего, приложение что-то делает после запуска Excel. Например, select или шлет событие какому-то контролу. Был вопрос. Решилось, когда все подобные движения были перенесены перед вызовом Excel.
C6/C11, ШВС, tps/btrieve.
Снова ShellExecute.
Это может происходить с любой версией операционной системы и обсуждалось миллион раз..
Я нажал на кнопку, чтобы вызвать Excel. Запустил ShellExecure, после чего обработка событий кнопки закончилась. На текущем экране происходит какое-то событие (например, Event:GainFocus или Event:Timer) и экран (вместе с ним и приложение) становится активным. А Excel, соответственно, нет.
Есть ещё пара соображений, которые могут помочь. Может быть, и этого хватит
1. В ShellExecute в качестве первого параметра передаётся Handle текущего окна, надо передать 0.
2. Перед вызовом ShellExecute вызвать функцию UnlockThread(), а после - LockThread().
Но, вообще-то открытие окна ожидания смотрится весьма приятно. В принципе, можно его размеры уменьшить до 1x1 или 0x0 и оно никому мешать не будет
Я нажал на кнопку, чтобы вызвать Excel. Запустил ShellExecure, после чего обработка событий кнопки закончилась. На текущем экране происходит какое-то событие (например, Event:GainFocus или Event:Timer) и экран (вместе с ним и приложение) становится активным. А Excel, соответственно, нет.
Есть ещё пара соображений, которые могут помочь. Может быть, и этого хватит
1. В ShellExecute в качестве первого параметра передаётся Handle текущего окна, надо передать 0.
2. Перед вызовом ShellExecute вызвать функцию UnlockThread(), а после - LockThread().
Но, вообще-то открытие окна ожидания смотрится весьма приятно. В принципе, можно его размеры уменьшить до 1x1 или 0x0 и оно никому мешать не будет
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4560
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 34 раза
Снова ShellExecute.
В разных версиях виндов один и тот же код программы отрабатывал по разному. Сейчас точно уже не помню, может, еще со времен windows 98 засело, в которой другая событийная модель. Но мне кажется, что было разное поведение и на windows xp и windows 2003 server. Сейчас на windows 7 проблемы с переключением на excel у меня не возникает, специально для этого никаких телодвижений не делаю. А также на Win2003, Win2008 - из того, что под рукой и могу проверить...
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 4960
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 6 раз
- Поблагодарили: 19 раз
Снова ShellExecute.
Да, передаю ноль.
Попробую, хотя и сомневаюсь в успехе.
Попробовать открыть промежуточное окно?
Систему пока не пойму, то переключается, то нет.
We are hard at work… for you.
-
- ✯ Ветеран ✯
- Сообщения: 1702
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Снова ShellExecute.
Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Снова ShellExecute.
>> Попробовать открыть промежуточное окно?
Дык, а я о чём? Как раз привожу примеры, когда открыается промежуточное Non-MDI окно без активных элементов вообще, а с него стартуется Ёксель...
>> Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
Какого окна?
Дык, а я о чём? Как раз привожу примеры, когда открыается промежуточное Non-MDI окно без активных элементов вообще, а с него стартуется Ёксель...
>> Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
Какого окна?
-
- ✯ Ветеран ✯
- Сообщения: 1702
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Снова ShellExecute.
Может я чего то не понял, "поднять" - обратится к окну 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) ! прыгнуть на окно по адресу
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 4960
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 6 раз
- Поблагодарили: 19 раз
Снова ShellExecute.
Не вариант. Excel вообще для примера, просто сейчас сложную диаграмму там рисую и столкнулся. А так, например, у нас фотки открываются во внешних программах. Возможно, в разных на разных компах. Для просмотра PDF - куча средств. Невозможно контролировать всё. И не контролирую, полагаюсь на ShellExecute.gopstop2007 писал(а): ↑16 Июнь 2017, 22:09 Может я чего то не понял, "поднять" - обратится к окну Excel.
We are hard at work… for you.