線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1448
推到 Plurk!
推到 Facebook!

为什么只能子类化一次?

 
KFC123_60201
一般會員


發表:58
回覆:18
積分:15
註冊:2006-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-08 21:35:28 IP:59.107.xxx.xxx 未訂閱
我在网上找到子类化的例子,把它用到监控一个IE窗口的事件
// m_Handle 是IE窗口的Handle
// m_NewWinProc :FARPROC 是新的subclass窗口
// m_OldWinProc :FARPROC 是原来subclass前的窗口
procedure SubClass;
begin
UnSubClass;
m_NewWinProc := Classes.MakeObjectInstance(WndProc);
m_OldWinProc := Pointer(GetWindowLong(m_Handle ,GWL_WNDPROC));
SetWindowLong(m_Handle, GWL_WNDPROC, LongInt(m_NewWinProc));
end;
procedure UnClass;
begin
if (m_Handle<>INVALID_HANDLE_VALUE) then
begin
if (m_OldWinProc<>nil) then
begin
if (Pointer(SetWindowLong(m_Handle, GWL_WNDPROC, LongInt(m_OldWinProc)))=nil) then
end;
m_OldWinProc := nil;
m_NewWinProc := nil;
m_Handle := INVALID_HANDLE_VALUE;
end;
end;
procedure WndProc(var CMessage: TMessage);
begin
if ((m_Handle<>INVALID_HANDLE_VALUE)) then
begin
// 处理事件
CMessage.Result := CallWindowProc(m_OldWinProc , m_Handle, CMessage.Msg, CMessage.wParam, CMessage.lParam);
end;
end;

每当打开一个IE窗口(每次只打开一个),我就调同一次SubClass,这样就可以在WndProc中处理发给IE窗口的事件。每当我关闭当前的IE窗口并打开另一个IE窗口时再调用一次SubClass(在SubClass中调用了UnSubClass)来处理新打开窗口的事件。但我发现只有第一次SubClass窗口时才有效,第二次就无法subclass了。为什么呢?

系統時間:2024-07-03 23:49:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!