:: Главная :: Решения :: Статьи :: Проект "Русский help" :: Файловый архив :: Фотоальбом :: Ссылки ::
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  


Форумы  :: FAQ FoxPro

Как вывести приложение на передний план
Дата: 04.03.07 14:17:33 ОтветитьЦитировать

Вопрос

Как вывести на передний план и активизировать окно нужного приложения. Это может быть окно Word, или ранее запущенное приложение FoxPro, или форма для ввода логина и пароля в приложении FoxPro (иногда она не выводится на передний план)

Ответ

Идея решения принадлежит Вадиму Пирожкову (piva)

Для вывода окна любого приложения на передний план, необходимо знать текст заголовка нужного окна.

LOCAL loShell, lcCaption
loShell=CreateObject("WScript.Shell")
lcCaption = "Заголовок_нужного_Окна"
IF loShell.AppActivate(m.lcCaption) = .T.
loShell.SendKeys("% ~")
ELSE
MessageBox("Приложение "+m.lcCaption+" не найдено")
ENDIF

Метод loShell.AppActivate() выполняет поиск приложения по первым символам заголовка нужного окна и активизирует его, что сопровождается выводом окна на передний план. Если указанного окна обнаружить не удалось, то данный метод вернет .F., но никакого сообщения об ошибке не будет.

Проблема в том, что метод loShell.AppActivate() выводит приложение на передний план "как есть". Например, если приложение было свернуто (минимизировано), то оно, конечно, будет активизировано. Но активизировано в том же, свернутом, состоянии.

Чтобы приложение развернуть на весь экран необходимо выполнить некоторые манипуляции в самом приложении. Нажать некую последовательность клавиш. Вот именно этим и занимается метод loShell.SendKeys() - посылает в активное приложение некоторый набор кодов клавиш.

В данном случае набор посылаемых клавиш основан на том факте, что большинство приложений имеет системное меню, которое вызывается комбинацией клавиш "ALT+пробел". Это системное меню раскрывается также по нажатию клавиши мыши в левом верхнем углу приложения на иконке самого приложения.

Данное меню содержит пункты по управлению размером и положением окна. Причем самый первый пункт этого меню "Восстановить". Этот пункт (поскольку он первый) автоматически становится активным при открытии меню. Остается только нажать клавишу Enter для его выбора.

Вот именно эта последовательность клавиш - ALT+пробел+ENTER - и зашифрована в параметре метода

loShell.SendKeys("% ~")

Если Вы уверены, что активизируемое Вами приложение находится в "нормальном", развернутом состоянии, то вызывать метод loShell.SendKeys() нет необходимости.

Также вызывать именно эту последовательность нажатия клавиш не имеет смысла, если приложение не имеет стандартного системного меню. В FoxPro подавить активизацию системного меню можно, например, установив свойство

_SCREEN.ControlBox = .F.

Условное обозначение кодов клавиш, используемых в методе SendKeys(), приведено в следующей таблице

Key Code
BACKSPACE {BACKSPACE}, {BS}, or {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL or DELETE {DELETE} or {DEL}
DOWN ARROW {DOWN}
END {END}
ENTER {ENTER}or ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS or INSERT {INSERT} or {INS}
LEFT ARROW {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN {PRTSC}
RIGHT ARROW {RIGHT}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
UP ARROW {UP}
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
Key Code
SHIFT +
CTRL ^
ALT %

Все прочие клавиши в методе SendKeys() выводятся как буквы соответствующих клавишь или их ASCII-коды в функции Chr(). Например, вместо символа "~" можно указать код chr(13) или {ENTER}

loShell.SendKeys("% "+chr(13))
* или
loShell.SendKeys("% {ENTER}")


Как вывести на передний план текущее приложение FoxPro

В этом случае, заголовком приложения является значение свойства

_SCREEN.Caption

LOCAL loShell
loShell=CreateObject("WScript.Shell")
loShell.AppActivate(_SCREEN.Caption)

В данном случае, как раз нет смысла использовать метод SendKeys() в силу того, что нужное Вам окно заведомо находится в нужном состоянии.


Как вывести на передний форму со свойством Form.ShowWindow = 2 - As Top-Level

Как правило, такие формы используются для ввода логина и пароля пользователя при открытии приложения. Однако, по умолчанию, на передний план выводится окно собственно среды FoxPro (_SCREEN), если до вызова формы была предпринята попытка активизировать основное окно FoxPro или сделать в него вывод какой-либо информации. Поэтому, зачастую, форма для ввода логина и пароля открывается, но на передний план не выводится.

В этом случае, в качестве заголовка окна используется заголовок формы.

* Вызываю форму для ввода логина и пароля
DO FORM MyTopForm.scx
* Вывожу ее на передний план
LOCAL loShell
loShell=CreateObject("WScript.Shell")
loShell.AppActivate(MyTopForm.Caption)
* Организую точку останова приложения
READ EVENTS

В данном случае, как раз нет смысла использовать метод SendKeys() в силу того, что нужное Вам окно заведомо находится в нужном состоянии.

Как вывести на передний план приложение Word или Excel в котором сформировали отчет

Довольно распространенный способ формирования отчетов - это прямое заполнение документов в Word или Excel. Естественно, после формирования отчета хотелось бы вывести его на передний план.

Приложение Word
* Создание экземпляра приложения Word
LOCAL loWord as Word.Application
loWord = CreateObject("Word.Application")
* Далее идет создание заполнение документа
...
* Сформированный документ делается видимым
loWord.Visible = .T.
* Выводится экземпляр приложения Word на передний план
LOCAL loShell
loShell=CreateObject("WScript.Shell")
IF loShell.AppActivate(loWord.Caption) = .T.
loShell.SendKeys("% ~")
ELSE
MessageBox("Приложение "+loWord.Caption+" не найдено")
ENDIF

Приложение Excel
* Создание экземпляра приложения Excel
LOCAL loExcel as Excel.Application
loExcel = CreateObject("Excel.Application")
* Далее идет создание и заполнение документа
...
* Сформированный документ делается видимым
loExcel.Visible = .T.
* Выводится экземпляр приложения Excel на передний план
LOCAL loShell
loShell=CreateObject("WScript.Shell")
IF loShell.AppActivate(loExcel.Caption) = .T.
loShell.SendKeys("% ~")
ELSE
MessageBox("Приложение "+loExcel.Caption+" не найдено")
ENDIF

Однако в отношении Word или Excel есть специфический способ активизации, основанный на том, что разворачивание этого окна на максимум из свернутого (минимизированного) состояния автоматически приводит к его активизации.

Приложение Word
* Выводится экземпляр приложения Word на передний план
#DEFINE wdWindowStateMinimize 2
#DEFINE wdWindowStateMaximize 1
loWord.WindowState = wdWindowStateMinimize && Сворачиваем окно
loWord.WindowState = wdWindowStateMaximize && Разворачиваем окно, что приводит к его активизации

Приложение Excel
* Выводится экземпляр приложения Excel на передний план
#DEFINE xlMinimized -4140
#DEFINE xlMaximized -4137
loExcel.WindowState = xlMinimized && Сворачиваем окно
loExcel.WindowState = xlMaximized && Разворачиваем окно, что приводит к его активизации

В качестве констант для сворачивания и разворачивания Excel можно также использовать значения 1 и 2 из набора констант Word.



Исправлено 3 раз(а). Последнее : Владимир Максимов, 17.06.07 16:35
Ratings: 0 negative/3 positive


Тема Просмотров Написано Написано
  Program 5563 Владимир Максимов 01.03.05 22:02
  Как определить директорию, из которой запущена программа 9794 Владимир Максимов 22.03.05 10:41
  Как проверить факт существования переменной памяти, поля таблицы, метода формы 14030 Владимир Максимов 20.04.05 18:31
  Как работать с ini-файлами 15792 Владимир Максимов 01.05.05 12:17
  Символьные поля, переменные памяти и константы 9741 Владимир Максимов 25.09.05 13:31
  Как работать с путями доступа и именами файлов, содержащих пробелы 7893 Владимир Максимов 22.02.06 22:00
  Как вывести приложение на передний план 18055 Владимир Максимов 04.03.07 14:17
  Как получить разницу двух дат в формате: лет, месяцев, дней 10773 Владимир Максимов 25.02.08 18:32


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 1 (Гостей: 1)

© 2006 Fox Club 
Яндекс.Метрика