-
здраствуйте! помогите присвоить ТWebbrowser свою процедуру обработки вставка из буфера. пытался сделать так:
...
private
procedure DoApplicationMessage(var Msg: TMsg; var Handled: Boolean);
...
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 не реагирует на данный код, а вставляет по прежнему из буфера что делать?
-
> что делать?
Для начала убедиться в том, что окно, которому адресовано WM_PASTE-сообщение, создано и принадлежит совсем другому кодовому потоку, а не основному код.потоку процесса твоего приложения
-
> Для начала убедиться в том, что окно, которому адресовано > WM_PASTE-сообщение, создано и принадлежит совсем другому > кодовому потоку, а не основному код.потоку процесса твоего > приложения
не понял, как вопрос решить-то?
-
Модератор уже пьян заранее? ДотНет то при чем вообще?
-
модератор фсегда прафф) раз сказали, что дотНет, значит дотНет
-
эй, люди, при чем тут модератор пьян и дотНет! ответьте кто-то по сути вопроса! Сергей М. написал про какой-то процесс, который не принадлежит кому-то, я не понял, при чем тут чужой процесс, я в своей программе пытаюсь перехватить, а не в чужом процессе. я уже на нескольких форумах вопрос написал, походу никто ничего сказать не может, в смысле - не знает. на одном предлагают глобальный хук вешать, на другом новую компоненту TEmbeddedWB , только никто не знает как этой компонентой пользоваться. вообщем - караул!!!
-
> при чем тут модератор пьян и дотНет
При том что вопрос действительно не имеет отношения к ДотНЕТу)
> какой-то процесс, который не принадлежит кому-то, я не понял, > при чем тут чужой процесс, я в своей программе пытаюсь > перехватить, а не в чужом процессе
Ты вообще разницу между процессом и тредом осюсяешь ? "Взаимоотношения" между тредами и процессами тебе знакомы ? Причем тут "чужой процесс" ? Речь идет о твоем процессе. И тредах, созданных неявно в его контексте.
-
> Сергей М. ©
Как сами то к этому относитесь?
-
как-то перекрыть событие можно или нет? и если да, то как? без вмешательства в тонкие материи вида процессов и трейдов?
-
> Venkin (04.01.08 13:06) [8]
Без вмешательства никак.
Если событие Application.OnMessage не "ловит" упомянутое оконное сообщение, при том что целевое окно гарантированно существует и нет ни намека на его модальность, то это может говорить только об одном - окно создано в дополнительном кодовом потоке, который ответственен за выборку и диспетчеризацию сообщений, адресованных целевому окну.
Событие же Application.OnMessage предназначено для нотификации о сообщениях, адресованных окнам, созданным в основном кодовом потоке процесса.
-
хм, а ведь TWеbbrowser это прямой наследник TWinControl, может быть как-то через WndProc можна? ок, а как тогда с вмешательством в эти самые трейды вопрос решить?
-
тайна, покрытая мраком...
-
> Venkin (04.01.08 22:37) [10]
TWеbbrowser, прежде всего, раппер (wrapper, "оболочка") COM-объекта, реализующего функциональность браузера. Мрачной тайной при этом является не наследие TWinControl'а, а потроха самого COM-объекта, который волен создавать свои потоки и свои окна.
> как тогда с вмешательством в эти самые трейды вопрос решить?
А ты уже ответил на вопрос в [1] ? Могу лишь предположить, что пляску с бубном следует начинать от GetWindowThreadProcessId + AttachThreadInput
-
> Могу лишь предположить, что пляску с бубном следует начинать > от GetWindowThreadProcessId + AttachThreadInput
хм, знаете, я уже нашел решение без плясок с бубном вокруг трейдов и процессов, правда покопался в инете изрядно... решилось через MsgHandlerprocedure 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'))) то не работает что-то... зараза
-
> ((Msg.wParam = VK_Control) and (Msg.wParam = ord('V'))) > > > то не работает что-то...
а как один параметр может быть равен одновременно и vk_control и 'V'?
-
а как должно быть правильно? ((Msg.wParam = VK_Control) and (Msg.lParam = ord('V'))) ???
-
вопрос решен. спасибо мне (увы из всех крутых программеров здесь, никто так и не сумел сказать что-то полезное).
|