Конференция "Сети" » Блокировать обкрытие окна по Ctll+O /L в TWebBrowser
 
  • sniknik © (06.12.11 11:26) [0]
    TWebBrowser используется для просмотра/печати отчетов (а ля фастрепорт/exel/просмотрщик rtf... впрочем эти тоже есть, html только один из), т.е. открытая страничка единственная, открытие второй, новые окна, ссылки блокируются, мышь тоже (меню), правда все это несколько кривым способом (ниже) от чего и "проблема".

    "Проблема", нужно убрать ставшее бесполезным окно перехода по Ctrl+O (введенная ссылка не сработает, но...).

    Пользовался переопределением событий в IE, на свой DocHostUIHandler, где и блокировал...  
    var
     hr: HResult;
     CustDoc: ICustomDoc;
    begin
     hr:= WebBrowser.Document.QueryInterface(ICustomDoc, CustDoc);
     if hr = S_OK then
       CustDoc.SetUIHandler(DocHostUIHandler);
    end;


    После стало нужно сделать сохранение "отчета", легко - WebBrowser.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER);, но с неожиданным результатом  - "Попытка отменить конечное место переноса, которое не было зарегистрировано"...
    Объяснение тут http://support.microsoft.com/kb/330441, и "решение" оттуда - "Не вызывайте метод SetUIHandler Если важно полное сохранение диалогового окна.", почему и стал извращаться.

    Ну так вот, нужно или "починить IE" для указанного использования, что думаю нереально, или просто блокировать оставшееся окно "Ctll+O Ctll+L". Блокировка клавиш результата не дает (когда "ввод проваливается в объект IE" форма событий не получает...??? или можно?), единственное что приходит в голову сделать "хук", но не хотелось бы, это на крайний случай (внутрь html на яваскрипте добавить нельзя, они могут быть сторонние...).
    Есть надежда что на TWebBrowser можно повлиять настройками (ну для IE то же самое можно отключить в реестре... ), только как? Есть ли что-то типа SetParameters и указания "не открывай окно url"... или подобное.

    p.s. Блин, чего то путано получилось... ну, надеюсь, буду понят. ;)
  • sniknik © (06.12.11 11:41) [1]
    Вот же..., пока писал пришло в голову, что обработчик событий на клавиши нужно вешать не на форму, а на сам TWebBrowser, нужно проверить. Может получится.
  • sniknik © (06.12.11 12:07) [2]
    > Может получится.
    Не получилось... нажатия ловятся, частично (клавиши отдельно проходят, Ctrl отдельно тоже, а на Ctrl+O нет события...), что наводит на мысль, что обработка в компоненте дельфи дублирована, и вторична.
  • Anatoly Podgoretsky © (06.12.11 12:21) [3]
    > sniknik  (06.12.2011 12:07:02)  [2]

    Работать надо, а не развлекаться.
  • Сергей М. © (06.12.11 12:25) [4]

    > sniknik


    цикл-то для всего VCL-приложения единый - в теле Application.Run ..

    там же вызывается обработчик Application.OnMessage, если он тобой назначен

    мимо него не проскочит ни одно сообщение окнам осн.потока, кроме WM_QUIT, так что в нем ты волен вытворять любые чудеса)
  • sniknik © (06.12.11 12:35) [5]
    > Работать надо, а не развлекаться.
    Блин, что то, уже тоже склоняюсь к мысли, типа "а хрен с ними с этими окнами, не нравится, пусть не нажимают...".
    Кстати есть еще одно, что надо бы блокировать, это Ctrl+N, новое окно не открывает, но надолго "подвисает" с курсором в виде песочных часов.

    > цикл-то для всего VCL-приложения единый - в теле Application.Run ..
    Проблема только в том, что TWebBrowser это как бы не VCL, это "враждебный" ActivX, "чужой",  в теле VCL-ого приложения...
  • sniknik © (06.12.11 12:37) [6]
    > Application.OnMessage
    Попробую... на всякий случай, в других местах и для другого использовал, в отчете пока, что нет.
  • Anatoly Podgoretsky © (06.12.11 12:48) [7]
    > sniknik  (06.12.2011 12:35:05)  [5]

    Если кто то нажмет Ctll+O, то он ССЗБ и нечего о нем думать.
  • Сергей М. © (06.12.11 12:53) [8]

    > это "враждебный" ActivX, "чужой",  в теле VCL-ого приложения


    и чего ?

    какой бы он ни был "чужим", я шибко сомневаюсь что он умудряется аттачиться из своих тредов ко вводу основного потока (который абсолютно подконтролен) и нагло тырить оттуда интересующие его сообщения
  • sniknik © (06.12.11 13:27) [9]
    > Если кто то нажмет Ctll+O, то он ССЗБ и нечего о нем думать.
    Не совсем, это клиент сервер, и там собственный прокси, а на клиентах запрет на инет... т.е. если я дам возможность то я ССЗБ, а лучше чтобы вообще не отсвечивало. Т.к. некоторые просто на окно могут показать типа вот у вас не правильно... и "клиент уйдет".

    > и чего ?
    Да действительно ничего... проверил, работает (вроде, раз получились "тупым методом отловить и подставить отловленные числа"), нормально сделать и пойдет.

    Спасибо.
  • Медвежонок Пятачок © (06.12.11 13:30) [10]
    а хтмл'ка-то c отчетом браузеру кем отдается?
    встроенным в ту же прогу сервером или есть настоящий?
  • sniknik © (06.12.11 13:45) [11]
    > а хтмл'ка-то c отчетом браузеру кем отдается?
    Да кем угодно. Т.е. было только локальным сервером (т.е. серверной частью клиент сервера), а стало (почему и меняю, и для чего нужно сохранение) что отчет может прийти с сервера компании (настоящий? ;)). Где его пишет кто ни попадя ... в смысле php-ники.
    Хотя конечно можно порядок навести, заложить какие то правила... но что то сомневаюсь что хотя бы через пару месяцев их кто то будет соблюдать... особенно если "клиент хочет".
  • Медвежонок Пятачок © (06.12.11 14:27) [12]
    я немного не так делаю.
    когда надо что-то показать "легко" - возникает соблазн сделать это через хтмл + ксс (потому что это действительно намного легче чем дизайнить классический отчет или дизайнить форму)

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

    как-то так.
  • sniknik © (06.12.11 14:40) [13]
    > возникает соблазн
    У меня это не соблазн, это "наследство", вместе с rtf. "Мое" это Excel и OO.
    (Гораздо лучше, и чаще используются из-за возможной динамики, я там данные гружу и по ним pivot таблицу с графиком строю...  а в "пивоте" поменять поле/разрез можно мышкой. Универсальный отчет. Хотя он сложнее для понимания наверное, т.к. первоначально клиенты обращают внимание на "классику", ее собственно и "развивают", но пока ничего перекрывающего возможности "моего" еще не сделали, так, частности.).
  • sniknik © (06.12.11 14:44) [14]
    > "наследство", вместе с rtf.
    Вернее не совсем "наследство", его тоже я сделал, но не из-за "показать "легко"" а из-за "нужно вот также, но изменяемый клиентом/шаблон", а изменяемый rtf в виде шаблона для перечислений из таблицы... "то еще счастье".
 
Конференция "Сети" » Блокировать обкрытие окна по Ctll+O /L в TWebBrowser
Есть новые Нет новых   [134436   +21][b:0][p:0.001]