![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как рлдменить оконную ф-цию окна, зная его хэндл? [D6, Win2k, WinXP]
Simon © (2003-12-01 21:56:00)
Приветствую уважаемые мастера! Вопрос такой. Как подменить оконную функцию чужого окна(TMemo), зная его хэндл? Пишу следующий код:
//-----------------------------------------------------------
procedure TForm1.ChangeWndProcClick(sender: TObject);
begin
SetWindowLong(MemoHandle,GWL_WNDPROC,integer(@NewProc));
end;
//-----------------------------------------------------------
//-----------------------------------------------------------
function NewProc(OldProc: pointer; h: HWND; m: MSG; wp: WParam; lp: LParam): LRESULT;
type TProc = function(h: HWND; m: MSG; wp: WParam; lp: LParam): LRESULT;
var pp: ^TProc;
begin
MessageBeep(MB_OK);
pp:=TProc(OldProc);
pp^(h,m,wp,lp);
end;
//-----------------------------------------------------------
Всё это в DLL. MessageBeep срабатывает, а потом ошибка... Подскажите пожалуйста, где я не прав(если можно, кусочек рабочего кода).
nikkie (2003-12-02 10:52:00) [1]
Всего пару дней назад сам столкнулся. Нужно быть аккуратнее, если окно unicode-овское. Например, при замене WndProc стандартным образом (как в [2]) окна в WebBrowser, находящегося в designMode, переставали вводиться русские буквы и прочие unicode-символы.
Вот здесь информация, как обойти эту проблему:
http://www.codeproject.com/win32/safesubclassing.asp
BiN (2003-12-02 10:27:00) [2]
Да-а вот только не CallWndProc а CallWindowProc
Simon (2003-12-01 23:37:00) [3]
Пасиба блин бальшое!!! бальшое блин спасиба!!! блин :)
jonni (2003-12-01 22:37:00) [4]
i esche luchshe vego na skol"ko ya ponimayu sdelat"
NewProc(h: HWND; m: MSG; wp: WParam; lp: LParam): LRESULT; stdcall <-- opisat" v classe Form1
i
function TForm1.NewProc(h: HWND; m: MSG; wp: WParam; lp: LParam): LRESULT;
jonni (2003-12-01 22:35:00) [5]
var
oldproc:Pointer;
jonni (2003-12-01 22:34:00) [6]
procedure TForm1.ChangeWndProcClick(sender: TObject);
begin
oldproc:=SetWindowLong(MemoHandle,GWL_WNDPROC,integer(@NewProc));
end;
function NewProc(h: HWND; m: MSG; wp: WParam; lp: LParam): LRESULT;
begin
MessageBeep(MB_OK);
Result:=CallWndProc(oldproc,h,m,wp,lp);
end;
Simon (2003-12-01 22:05:00) [7]
...или хотя бы где почитать на русском(в хэлпе туман)