Снова ShellExecute.

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Снова ShellExecute.

Сообщение kreator »

Открываю файлы Shellexecute'ом. Параметр nShowCmd выставляю "SW_SHOW". Много экспериментировал со значениями этого параметра. И вроде с "SW_SHOW" всё более-менее. Но иногда (причём не всегда) управление не передаётся в программу, которой открывается файл. Такая ситуация, например, с Excel. Если он открыт, то мой файл открывается в "minimize" режиме. Приходится явно кликать на иконку Экселя на панели задач. Что можно сделать, чтобы гарантированно Экселю передалось управление? Параметру nShowCmd другое значение дать? Какое?
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Снова ShellExecute.

Сообщение 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
Последний раз редактировалось Yufil 16 Июнь 2017, 15:07, всего редактировалось 2 раза.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Снова ShellExecute.

Сообщение Дед Пахом »

Можно ещё посмотреть в сторону ShellExecuteEx и флага SEE_MASK_NOASYNC.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Снова ShellExecute.

Сообщение kreator »

Yufil писал(а): 16 Июнь 2017, 15:00 Дело в том, что пока Ёксель запускается,запускающее приложение становится активным.
Не понял. Я из своего окна (которое не собираюсь закрывать) просто вызываю ShellExecute, а ShellExecute запускает Excel. Если Excel не запущен уже, то всё хорошо - Excel открывается (не быстро) и остаётся поверх всех окон. А вот, если он уже запущен, то файл открывается без проблем, но на само окно Excel переключения может и не произойти. Ещё заметил, что, если окно Excel явно минимизировано, то переключение на окно Excel всегда есть. Может я парюсь? Всё зависит от компа и конкретной Винды? Семёрка группирует открытые окна одного приложения, может в этом какой-то эффект?
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4560
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Снова ShellExecute.

Сообщение finsoftrz »

От винды зависимость точно есть. Скорее всего, приложение что-то делает после запуска Excel. Например, select или шлет событие какому-то контролу. Был вопрос. Решилось, когда все подобные движения были перенесены перед вызовом Excel.
C6/C11, ШВС, tps/btrieve.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Снова ShellExecute.

Сообщение Yufil »

Это может происходить с любой версией операционной системы и обсуждалось миллион раз..

Я нажал на кнопку, чтобы вызвать 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.

Сообщение finsoftrz »

В разных версиях виндов один и тот же код программы отрабатывал по разному. Сейчас точно уже не помню, может, еще со времен windows 98 засело, в которой другая событийная модель. Но мне кажется, что было разное поведение и на windows xp и windows 2003 server. Сейчас на windows 7 проблемы с переключением на excel у меня не возникает, специально для этого никаких телодвижений не делаю. А также на Win2003, Win2008 - из того, что под рукой и могу проверить...
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Снова ShellExecute.

Сообщение 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 у меня не возникает, специально для этого никаких телодвижений не делаю.
Систему пока не пойму, то переключается, то нет.
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Снова ShellExecute.

Сообщение gopstop2007 »

Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Снова ShellExecute.

Сообщение Yufil »

>> Попробовать открыть промежуточное окно?

Дык, а я о чём? Как раз привожу примеры, когда открыается промежуточное Non-MDI окно без активных элементов вообще, а с него стартуется Ёксель...

>> Может проще, хендл окна Excel запомнить при первом открытии и обращаться к нему?

Какого окна?
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Снова ShellExecute.

Сообщение 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)         ! прыгнуть на окно по адресу
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Снова ShellExecute.

Сообщение kreator »

gopstop2007 писал(а): 16 Июнь 2017, 22:09 Может я чего то не понял, "поднять" - обратится к окну Excel.
Не вариант. Excel вообще для примера, просто сейчас сложную диаграмму там рисую и столкнулся. А так, например, у нас фотки открываются во внешних программах. Возможно, в разных на разных компах. Для просмотра PDF - куча средств. Невозможно контролировать всё. И не контролирую, полагаюсь на ShellExecute.
We are hard at work… for you. :)
Ответить