Как активизировать окно 1с программно #156543


#0 by Ardi
например при срабатывании ОбработкаВнешнегоСобытия
#1 by PaulBC
#2 by smaharbA
Лучче определить ProcessID и AppActivate(ProcessID)
#3 by Ardi
Не получается: Другие приложения активируются, а "1С:Предприятие" и другие куски из его заголовка не берет. Код выдает -1 и 0
#4 by smaharbA
-1 это сработало, 0  нет, а меня что непослушал ? И уж если по заголовку то примерно так
#5 by smaharbA
И посмотри чем отличаются "1C:Предприятие... и "1С: Предприятие...
#6 by romix
Внешняя компонента DialMail содержит метод для активизации текущего окна 1С. Ее работоспособность может зависеть от версии виндов: в новых виндах Microsoft стремится такие возможности ограничить и прикрыть, чтобы левые окна не мешали юзерам работать со своим основным окном (описание темы - в книге Рихтера).
#7 by smaharbA
8 строк и железно активизирует, но... активное еще не значит что фореграунд...
#8 by Ardi
Не помогает. А как ProcessID определить?
#9 by romix
Я думаю хочет фореграунд, например, когда считался штрихкод. Хотя наверное проще забить на такие предъявы, чем их выполнять (имхо системное ограничение самих виндов). DialMail некими забавными трюками (я смотрел отладчиком) это ограничение обходил, но не факт что это работает во всех виндах.
#10 by Ardi
Как страшно жить на свете.
#11 by smaharbA
Должно помоч, посмотри заголовок и ту строку что создается в совпадают ?
#12 by Ardi
Не хочет. Другие приложения через WSHShell.appactivate(ProcessID) активирует, а само себя не хочет. Стоит WinXP sp2.
#13 by smaharbA
Ну тогда только через внешнее с задержкой... напишу счас и коду немного Да, а при выполнении в панели мигает ?
#14 by smaharbA
Вот счас попробовал... ... Работает...
#15 by Ardi
не мигает.
#17 by smaharbA
Ну так и я могу,.... а "мурку" можешь...(с) ;)
#18 by romix
что-то мне этот хакерский набор вызовов напоминает DialMail (там работало, но в более новых Windows уже не работало). Возможно, системная блокировка на автоактивацию своего собственного окна распространяется и на дочерние процессы?
#19 by romix
Предлагаю сделать фоново запущенную (из Автозагрузки) прогу, которая опрашивает признак (например, наличие файла) и в зависимости от него активизирует окно. :-)
#20 by smaharbA
Не не влияет, у него выходит так внешнеесобытие еще не отработало, а управление уже попало в 1с, тут нужна задержка и все...Проверить просто перед этим вставить код ВвестиСтроку("","",0,3) к примеру...только не предупреждение, у него тайминг когда окно неактивно стоит...
#21 by smaharbA
Да все просче и со внешним, простое создается скрипт хоть объектом текст туда передают пид и задержку секунды две и все... Но можно и без скрипта обойтись...
#22 by Ardi
Мигает. Но видимым не становится. У тебя какой виндовс? ОбработкаВнешнегоСобытия сейчас проверить не могу.
#23 by MMF
A process can set the foreground window only if one of the following conditions is true: The process is the foreground process. The process was started by the foreground process. The process received the last input event. There is no foreground process. The foreground process is being debugged. The foreground is not locked (see LockSetForegroundWindow). The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo). Windows 2000/XP: No menus are active. With this change, an application cannot force a window to the foreground while the user is working with another window. Instead, Foreground and Background Windows will activate the window (see SetActiveWindow) and call the function to notify the user. However, on Microsoft Windows 98 and Windows Millennium Edition (Windows Me), if a nonforeground thread calls SetForegroundWindow and passes the handle of a window that was not created by the calling thread, the window is not flashed on the taskbar. To have SetForegroundWindow behave the same as it did on Windows 95 and Microsoft Windows NT 4.0, change the foreground lock timeout value when the application is installed. This can be done from the setup or installation application with the following function call: SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); This method allows SetForegroundWindow on Windows 98/Windows Me and Windows 2000/Windows XP to behave the same as Windows 95 and Windows NT 4.0, respectively, for all applications.
#24 by MMF
(23+) хотите гарантировано стать верхним окном и не мигать на панели - см. 16. Кроме того, возможно, следует подумать об остановке скринсейвера.
#25 by smaharbA
Этт все ясно Михаил, но ведь хотся подручными средствами, конечно смогу, но вот как человеку помоч реально ? Можно конечно из подручных динврап предложить, или еще какой врап, можно как я люблю вордом обойтись(но этт тяжеловато для такой простой задачи ;))
#26 by MMF
дык пусть напишет малюсенькую внешнюю компоненту из одного метода. Еще когда-нить будет тесно в рамках 1С - добавит еще что-нить.
#27 by smaharbA
А вобщемто верно, может эта малюсенькая ВК и другому народу пользительна станет...
#28 by romix
Щас напишу... С разрешения Михаила
#29 by MMF
до кучи - остановка скринсейвера var
#30 by Ardi
Я дико извиняюсь, но что с этим делать?
#31 by MMF
ну вон грозится сделать ВК. А тебе останется только написать ОбъектВК.СкринСейверСдохни и ОбъектВК.НуКаВверх... хотя, возможно названия методов не будут столь поэтичными
#32 by romix
Окно пару раз подмигивает, но не активизируется. Windows 2000, SP4.
#33 by romix
...
#34 by MMF
iExtWindows.GetAppMDIFrame(MainWindow);
#35 by romix
То же самое. Мигает 2 или 3 раза. Щас перепроверю.
#36 by romix
(+35) Перепроверил путем втыкания мессаджбокса (он кстати вылазит 2 раза - видимо инит проходит 2 раза.
#37 by MMF
дык ясен пень, Init выполняется два раза (у тебя ж компонента экспортирует один объект).  procedure Activate1C как вызывается?
#38 by romix
Видимо, разработчики виндов тоже прочитали эту азбуку, и решили прикрыть и эту лазейку. :-) Остается поюзать "There is no foreground process". Может, сначала свернуть все окна, подождать секунду, и развернуть окно 1С? :-)
#40 by romix
из function AddInObject.CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray): HResult; stdcall;
#41 by MMF
щас я уже выключил Дельфи, но я приводил код из работающих сырцов. Завтра попробую собрать компоненту, авось получится
#42 by romix
Может у тебя процесс был "Being debugged", и поэтому все работало?
#43 by smaharbA
Да блин, что вордом сделать ?
#44 by romix
Пока ничего - имхо это все не работает... Ибо разработчики виндов этот лаз похоже прикрыли в 2000 SP4.
#45 by smaharbA
Ну что вышел каменный цветок, вот тупенький но железный метод... ... ...
#46 by romix
Прикольно, но не работает. Раз в 5 секунд 1С в трее 3 раза подмигивает... Имхо задача не решается... Хотя можно попробовать такой изврат: запустить из ВК маленькую оконную прогу в debug-режиме, и ее окно станет Foreground. А из нее уже активизировать что хочется...
#47 by smaharbA
Работает, только задержку надо воткнуть между    Shell.UndoMinimizeAll;    WSHShell.appactivate(ProcessID);
#48 by smaharbA
+ У меня послабее будет машина ;)
#49 by romix
Так что ли: У меня опять мигает в таскбаре, но не активизируется. Имхо ограничение виндовс. У меня XP SP2.
#50 by smaharbA
Я на 2003 пробовал, можно еще так  Shell.TogleDesktop;
#51 by smaharbA
Можно еще извратнее, но через АПИ, сделать вообще топмост... тогда больше ниодно приложение не покажется ;) гдето у меня такое было...
#52 by swa
Мда, не я один такой... Одно из решений - сначала "свернуть" окно, потом "развернуть" (RESTORE или MAXIMIZE), а потом уже SetForegroundWindow. Результат - окно "впереди" других. Но тоже в нек. ситуациях не срабатывает. так категорично :) . В каких версиях операционок не работает? Проверял на XP, 2000 prof.
#53 by evGenius
Вот есть рабочий кусочек на сях: Как утверждает документация, SetForegroundWindow работает как нам нужно, только если вызывающий её процесс является активным. А активен тот процесс, чей поток обрабатывает пользовательский ввод. Оказывается, наш процесс может "прикинуться" активным, подключив свой поток к обработке пользовательского ввода. Это осуществляется при помощи функции AttachThreadInput. После вызова SetForegroundWindow можно будет отключиться от чужого потока, используя ту же функцию (но передавая в качестве третьего параметра FALSE, а не TRUE). Реализация этой идеи выглядит так.
#54 by smaharbA
Уже прошли это... Вот подделал и ввод активизировал, работает ведь... ... ...
#55 by evGenius
Где прошли?
#56 by swa
Замечательный способ! А почему (с) не проставлены?
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С