Форум » [x]Harbour » Как вывести окно Word на передний план? » Ответить

Как вывести окно Word на передний план?

Andrey: Проблема появилась на Word2010. До этого все нормально показывалось и сейчас показывает. Вот мой код: oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFileDoc ) oActive := oWord:ActiveDocument oSelect := oWord:Selection oMarks := oActive:BookMarks oWord:Visible := .T. oWord:WindowState := 1 // Maximize oSelect:HomeKey(6) Что нужно сделать еще для Word2010 ?

Ответов - 24, стр: 1 2 All

Andrey: Таже самая проблема (НУ НЕ ХОЧЕТ Word или Excel выводится на передний план) появилась и на связке Win8 + Word2003 ! Народ, подскажите как с этим бороться ? Каждый раз юзер должен искать Word на панели управления и тыкать на нем....

fil: Есть такая API функция SetWindowPos. Можно ее пробнуть.

Andrey: fil пишет: Есть такая API функция SetWindowPos. Можно ее пробнуть. А как ? Дай пример пожалуйста....


fil: Типа так: setwindowpos( oWord:hWnd, -1, 0, 0, 0, 0, 3 ) В харборе эта функция вроде есть.

Andrey: А как я определю номер хенла окна "oWord:hWnd" ? Есть такая функция ?

fil: можно через FindWindow()

Andrey: Уважаемые ! Подскажите как окно, которое появляется в WinWord-е при повторном открытии через OLE-объект: вывести на передний план ? А то WORD 2 раза открывается и висит, ждет пока пользователь достанет это малюсенькое окно из под всех открытых задач на экране... Юзера достали.... Помогите....

vvv: Есть предположение, что дело тут в самой Винде. У меня на семерке регулярно такая беда случается, причем не с харборовскими программами и не обязательно с Word-oм. Например, при установке какой-нибудь программы новые окошки не выводятся на передний план, как должно бы быть, а тырятся где-то на заднем плане. Возможно, где-то что-то в настройках винды надо подправить. Подробно этим не занимался, бо не припекло.

a_sidorov: При установке программы лечится использованием использованием более поздней версией инсталлятора, если программа установки собрана на инсталляторе под ХР, то ничего не сделаеш. Нам пришлось поменять версию инсталлятора и после этого программа установки начала работать правильно. Либо MS Word под ХР, либо Harbour не допилен под семерку.

SergKis: Andrey пишет:Юзера достали.... Помогите.... Похожая ситуация была при временном использовании trial DoPdf.exe 7-ой версии. Там было два окна запроса: 1. Title окна "doPDF - Save PDF" file и кнопки Ok, Cancel 2. Title окна "Save" и кнопки Yes, No Чтобы юзера не доставали, решил через AutoIt3 - ловит появление окна и нажимает кнопку Ok или Yes соответственно. Код AutiIt3:[pre2] #NoTrayIcon Opt("TrayMenuMode" , 1) $proc = @ScriptName ; process name $capt = $proc & " started" If WinExists($capt) Then ; уже запущен $pidp = ProcessExists($proc) If $pidp Then WinClose($capt) Exit EndIf EndIf AutoItWinSetTitle($capt) ; set caption $pcap = "doPDF - Save PDF file" ; caption doPdf7 (print window) $idok = 1437 ; ID control button OK. вариант 1. $okid = "[CLASS:Button;INSTANCE:9]" ; ID control button OK. вариант 2. $scap = "Save" ; caption window Save $id_s = 1629 ; ID control button Yes. вариант 1. $s_id = "[CLASS:Button;INSTANCE:2]" ; ID control button Yes. вариант 2. $step = 1000 ; OnTimer millisec. $exit_item = TrayCreateItem("Exit",-1, 0, -1) TraySetState() TraySetToolTip($capt) AdlibRegister( "MonitorStop" , $step ) ; OnTimer set While 1 $msg = TrayGetMsg() Select Case $msg = 0 ContinueLoop Case $msg = $exit_item ExitLoop EndSelect WEnd Exit Func MonitorStop() If WinExists($pcap, "") Then AdlibUnRegister() ; OnTimer stop ControlClick($pcap, "", $idok) ; или ControlClick($capt, "", $okid) IF WinWaitActive($scap, "", $step) Then ControlClick( $scap, "", $id_s) ; Yes window Save EndIf AdlibRegister( "MonitorStop" , $step ) ; OnTimer set EndIf EndFunc [/pre2] Может Гуру помогут решить аналогичную задачу под hb.

fil: А что, незя найти хендл этого окна ? А дале как обычно: setwindowpos( ЭтоОкно:hWnd, -1, 0, 0, 0, 0, 3 )

Andrey: fil пишет: А что, незя найти хендл этого окна ? Подскажи пожалуйста, как найти окно WORD'а с открытым файлом ? Я тут несколько экспериментов провел, разные вот варианты: для 2003 - "09-01326 - MICROSOFT WORD", "TEST26 - MICROSOFT WORD" для 2007 - "13-00385 [Режим ограниченной функциональности] - MICROSOFT WORD" Есть ли какое правило для создания имени ОКОН ? fil пишет: setwindowpos( ЭтоОкно:hWnd, -1, 0, 0, 0, 0, 3 ) А как в хХарборе использовать это ? Такой функции нет в нем ! Хотя можно наверно использовать из МиниГуи - MAXIMIZE( hWnd )....

fil: Ну я же писал (выше) - через findwindow. И findwindow и setwindowpos это API-шные функции.

Andrey: fil пишет: setwindowpos это API-шные функции. findwindow - выдрал из МиниГУи, да и остальное тоже. Вот набросал небольшую программку, работает... Что там в ней подправить нужно, чтобы не сбоила ? FUNCTION MAIN(cTitle) //LOCAL cTitle := "12-00104 - MICROSOFT WORD" LOCAL hWnd, nI hWnd := FindWindow( cTitle ) ? "Hendle windows ["+cTitle+"] =",hWnd IF hWnd > 0 ? "Windows ["+cTitle+"] found !" wait // Display selected file MAXIMIZE( hWnd ) ENDIF wait RETURN NIL #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #define VM_CLOSE 16 HB_FUNC ( FINDWINDOW ) { hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( HIDE ) { ShowWindow( (HWND) hb_parnl(1), SW_HIDE ); } HB_FUNC( SSHOW ) { ShowWindow( (HWND) hb_parnl(1), SW_SHOW ); } HB_FUNC( KKILL ) { SendMessage( (HWND) hb_parnl(1), VM_CLOSE,0,0); //DestroyWindow( (HWND) hb_parnl(1), VM_CLOSE); } #pragma ENDDUMP Есть ли какое правило для создания имени ОКОН ? И можно ли искать окно по маске (допустим WORD) ? А то при переборе списка окон ТОРМОЗА начинаются... По 15-20 минут перебираются окна... Кто не верит смотрите - http://clipper.borda.ru/?1-4-20-00000637-000-0-0-1353747644

fil: 1. Что имеется в виду под "не сбоила" ? 2. Что значит имя окна ?

Andrey: fil пишет: 1. Что имеется в виду под "не сбоила" ? Ну не знаю, я с API не работал, может еще чего надо вызывать... fil пишет: 2. Что значит имя окна ? Вот обнаружил для 2007 - "13-00385 [Режим ограниченной функциональности] - MICROSOFT WORD" т.е. нужно делать поиск 2х окон: 1) "13-00385 [Режим ограниченной функциональности] - MICROSOFT WORD" 2) "13-00385 - MICROSOFT WORD" А еще варианты могут быть ?

fil: Можно перебрать окна через EnumChildWindows (если есть. Или API) Можно перебрать дочерние окна десктопа. Смотреть их заголовки на тему WORD

Andrey: С этим вроде разобрались. Теперь другая непонятка. Если файл *.DOC битый, ну что-то в нем сбойнуло, то при прямом открытие через ПРОВОДНИК сам Word выдает ошибку: А через вызов через OLE - не выдает ошибку, где то в памяти невидимый сидит и молчит ! А юзера в панику... Как открывать WORD сразу видимым ?

petr707: На картинке имя файла вообще-то не *.DOC, а RTF Зачем тогда Вам нужен этот плохо управляемый Word 2010? Открывайте rtf своей компонентой и no problem

Andrey: petr707 пишет: Зачем тогда Вам нужен этот плохо управляемый Word 2010? Все на нем сидят ! Я им что правила свои диктовать буду ?

fil: A видимость для word'a, перед загрузкой файла, случаем не фалсе ? oWrd:Visible:= .F.

Andrey: fil пишет: A видимость для word'a, перед загрузкой файла, случаем не фалсе ? Нет ! В самом начале темы я привел свой код, синеньким цветом... oWord:Visible := .T. Может там что добавить нужно ? И еще сделал добавление в функцию: HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); ShowWindow( (HWND) hb_parnl(1), SW_MAXIMIZE ); }

fil: Синенький текст я видел. Там oWord:Visible := .T. устанавливается после открытия файла, а желательно перед. Возможно стоит сначала вывести Word на экран, а потом открывать файл

Andrey: Т.е. ставлю сразу за oWord := TOleAuto():New( "Word.Application" ) ?



полная версия страницы