Страница 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.