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


Форумы  :: FAQ FoxPro

Как вывести приложение на передний план
Дата: 04.03.07 13: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.



Исправлено: Владимир Максимов, 17.06.07 15:35
Ratings: 0 negative/2 positive


Тема Просмотров Написано Написано
  Program 5159 Владимир Максимов 01.03.05 21:02
  Как определить директорию, из которой запущена программа 8854 Владимир Максимов 22.03.05 09:41
  Как проверить факт существования переменной памяти, поля таблицы, метода формы 11866 Владимир Максимов 20.04.05 17:31
  Как работать с ini-файлами 14468 Владимир Максимов 01.05.05 11:17
  Символьные поля, переменные памяти и константы 8523 Владимир Максимов 25.09.05 12:31
  Как работать с путями доступа и именами файлов, содержащих пробелы 6327 Владимир Максимов 22.02.06 21:00
  Как вывести приложение на передний план 16357 Владимир Максимов 04.03.07 13:17
  Как получить разницу двух дат в формате: лет, месяцев, дней 9391 Владимир Максимов 25.02.08 17:32


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

On-line: 53 Гулин Федор  and Guests: 52


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