Конференция ".Net" » присвоить Webbrowser свою процедуру обработки событий [D7, WinXP]
 
  • Venkin (29.12.07 15:03) [0]
    здраствуйте!
    помогите присвоить ТWebbrowser свою процедуру обработки вставка из буфера.
    пытался сделать так:

    ...
    private
    procedure DoApplicationMessage(var Msg: TMsg; var Handled: Boolean);
    ...

    {$R *.dfm}

    Procedure tForm1.DoApplicationMessage(var Msg: TMsg; var Handled: Boolean);
    begin
    if (msg.message = WM_PASTE) then
    handled := true; // по идее компонента не должна получать //сообщение
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    application.OnMessage := doApplicationMessage;
    end;


    но webbrowser не реагирует на данный код, а вставляет по прежнему из буфера
    что делать?
  • Сергей М. © (29.12.07 15:54) [1]

    > что делать?


    Для начала убедиться в том, что окно, которому адресовано WM_PASTE-сообщение, создано и принадлежит совсем другому кодовому потоку, а не основному код.потоку процесса твоего приложения
  • Venkin (29.12.07 16:57) [2]

    > Для начала убедиться в том, что окно, которому адресовано
    > WM_PASTE-сообщение, создано и принадлежит совсем другому
    > кодовому потоку, а не основному код.потоку процесса твоего
    > приложения


    не понял, как вопрос решить-то?
  • homm © (29.12.07 19:55) [3]
    Модератор уже пьян заранее? ДотНет то при чем вообще?
  • MetalFan © (29.12.07 22:04) [4]
    модератор фсегда прафф)
    раз сказали, что дотНет, значит дотНет
  • Venkin (29.12.07 23:19) [5]
    эй, люди, при чем тут модератор пьян и дотНет! ответьте кто-то по сути вопроса!
    Сергей М. написал про какой-то процесс, который не принадлежит кому-то, я не понял, при чем тут чужой процесс, я в своей программе пытаюсь перехватить, а не в чужом процессе.
    я уже на нескольких форумах вопрос написал, походу никто ничего сказать не может, в смысле - не знает.
    на одном предлагают глобальный хук вешать, на другом новую компоненту
    TEmbeddedWB

    , только никто не знает как этой компонентой пользоваться.
    вообщем - караул!!!
  • Сергей М. © (02.01.08 14:20) [6]

    >  при чем тут модератор пьян и дотНет


    При том что вопрос действительно не имеет отношения к ДотНЕТу)


    > какой-то процесс, который не принадлежит кому-то, я не понял,
    >  при чем тут чужой процесс, я в своей программе пытаюсь
    > перехватить, а не в чужом процессе


    Ты вообще разницу между процессом и тредом осюсяешь ?
    "Взаимоотношения" между тредами и процессами тебе знакомы ?
    Причем тут "чужой процесс" ? Речь идет о твоем процессе. И тредах, созданных неявно в его контексте.
  • sdts (02.01.08 14:46) [7]

    > Сергей М. ©

    Как сами то к этому относитесь?
  • Venkin (04.01.08 13:06) [8]
    как-то перекрыть событие можно или нет? и если да, то как?
    без вмешательства в тонкие материи вида процессов и трейдов?
  • Сергей М. © (04.01.08 15:15) [9]

    > Venkin   (04.01.08 13:06) [8]


    Без вмешательства никак.

    Если событие Application.OnMessage не "ловит" упомянутое оконное сообщение, при том что целевое окно гарантированно существует и нет ни намека на его модальность, то это может говорить только об одном - окно создано в дополнительном кодовом потоке, который ответственен за выборку и диспетчеризацию сообщений, адресованных целевому окну.

    Событие же Application.OnMessage предназначено для нотификации о сообщениях, адресованных окнам, созданным в основном кодовом потоке процесса.
  • Venkin (04.01.08 22:37) [10]
    хм, а ведь TWеbbrowser это прямой наследник TWinControl, может быть как-то через WndProc можна?
    ок, а как тогда с вмешательством в эти самые трейды вопрос решить?
  • Venkin (07.01.08 10:18) [11]
    тайна, покрытая мраком...
  • Сергей М. © (13.01.08 19:52) [12]

    > Venkin   (04.01.08 22:37) [10]


    TWеbbrowser, прежде всего, раппер (wrapper, "оболочка") COM-объекта, реализующего функциональность браузера. Мрачной тайной при этом является не наследие  TWinControl'а, а потроха самого COM-объекта, который волен создавать свои потоки и свои  окна.


    > как тогда с вмешательством в эти самые трейды вопрос решить?


    А ты уже ответил на вопрос в [1] ?
    Могу лишь предположить, что пляску с бубном следует начинать от GetWindowThreadProcessId + AttachThreadInput
  • Venkin (18.01.08 00:39) [13]

    > Могу лишь предположить, что пляску с бубном следует начинать
    > от GetWindowThreadProcessId + AttachThreadInput

    хм, знаете, я уже нашел решение без плясок с бубном вокруг трейдов и процессов, правда покопался в инете изрядно...
    решилось через MsgHandler

    procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
    var iOIPAO: IOleInPlaceActiveObject;
    Dispatch: IDispatch;
    begin
     if not Assigned(WebBrowser1) then  begin
       Handled := False;
       Exit;
     end;
    Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
     if (Handled) and (not WebBrowser1.Busy) then  begin
     if FOleInPlaceActiveObject = nil then  begin
         Dispatch := WebBrowser1.Application;
         if Dispatch <> nil then
         begin
         Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
         if iOIPAO <> nil then
            FOleInPlaceActiveObject := iOIPAO;
         end;
       end;
        if FOleInPlaceActiveObject <> nil then
        if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
           ((Msg.wParam = VK_Control) or (Msg.wParam = ord('V'))) then
           showmessage('oops')
         else
           FOleInPlaceActiveObject.TranslateAccelerator(Msg);
     end;
    end;


    правда  реагирует на клавиши раздельно, а мне нужно чтоб вместе CTRL+V ловились.
    когда вместо
    ((Msg.wParam = VK_Control) or (Msg.wParam = ord('V')))
    ставлю
    ((Msg.wParam = VK_Control) and (Msg.wParam = ord('V')))

    то не работает что-то...
    зараза
  • clickmaker © (18.01.08 17:50) [14]

    > ((Msg.wParam = VK_Control) and (Msg.wParam = ord('V')))
    >
    >
    > то не работает что-то...

    а как один параметр может быть равен одновременно и vk_control и 'V'?
  • Venkin (18.01.08 22:35) [15]
    а как должно быть правильно?
    ((Msg.wParam = VK_Control) and (Msg.lParam = ord('V')))
    ???
  • Venkin (19.01.08 10:20) [16]
    вопрос решен.
    спасибо мне (увы из всех крутых программеров здесь, никто так и не сумел сказать что-то полезное).
 
Конференция ".Net" » присвоить Webbrowser свою процедуру обработки событий [D7, WinXP]
Есть новые Нет новых   [118482   +49][b:0][p:0.002]