全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2554
推到 Plurk!
推到 Facebook!

用SetWindowLong這個API函數來SubClass 抓取訊息?

答題得分者是:RaynorPao
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-13 12:08:37 IP:210.85.xxx.xxx 未訂閱
我想用SetWindowLong這個API函數來SubClass 抓取訊息~ 寫了個程式~ 出現一堆錯誤~ 幫我看看錯在哪阿? PS:請不要叫我用其它方法 抓訊息~ 因為其他方法我都會了~    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; long OldForm1WndProc; long My_WndProc(HWND ,UINT ,WPARAM ,LPARAM ); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldForm1WndProc = GetWindowLong(Form1->Handle,GWL_WNDPROC); SetWindowLong(Form1->Handle,GWL_WNDPROC,(long)My_WndProc ); } //--------------------------------------------------------------------------- long My_WndProc(hwnd,Msg,wParam,lParam) { //處理訊息..... return CallWindowProc(OldForm1WndProc,hwnd,Msg,wParam,lParam) } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { SetWindowLong(Form1->Handle,GWL_WNDPROC,OldForm1WndProc); } //---------------------------------------------------------------------------
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-13 12:47:40 IP:203.73.xxx.xxx 未訂閱
引言: 我想用SetWindowLong這個API函數來SubClass 抓取訊息~ 寫了個程式~ 出現一堆錯誤~ 幫我看看錯在哪阿? PS:請不要叫我用其它方法 抓訊息~ 因為其他方法我都會了~
builder78 你好: 改成以下這樣試試看 < class="code"> #include #pragma hdrstop #include "Unit1.h" WNDPROC OldForm1WndProc; LRESULT CALLBACK My_WndProc(HWND ,UINT ,WPARAM ,LPARAM ); //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldForm1WndProc=(WNDPROC)GetWindowLong(Form1->Handle, GWL_WNDPROC); SetWindowLong(Form1->Handle, GWL_WNDPROC, (LONG)My_WndProc ); } //--------------------------------------------------------------------------- LRESULT CALLBACK My_WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { //處理訊息..... return CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { SetWindowLong(Form1->Handle, GWL_WNDPROC, (LONG)OldForm1WndProc); } -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-13 13:03:27 IP:210.85.xxx.xxx 未訂閱
恩~~ 還是版主有經驗~ 寫程式可真是要注意很多規定~ 明明知道原理~ 稍微一點不符合規定 就不會讓你編譯成功 API定義一堆型別~ BCB 也自訂一堆型別~ 有時真不知該選哪個型別~~ 真是傷腦筋耶~
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-13 13:25:31 IP:210.85.xxx.xxx 未訂閱
再請問一下 若處理訊息中 有用到VCL 元件時 該怎半呢?    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; WNDPROC OldForm1WndProc; LRESULT CALLBACK My_WndProc(HWND ,UINT ,WPARAM ,LPARAM ); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldForm1WndProc=(WNDPROC)GetWindowLong(Form1->Handle, GWL_WNDPROC); SetWindowLong(Form1->Handle, GWL_WNDPROC, (LONG)My_WndProc ); } //--------------------------------------------------------------------------- LRESULT CALLBACK My_WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if (Msg == WM_RBUTTONDOWN) { Edit1->Text="抓到滑鼠右鍵壓下的訊息"; //這行會說Edit1沒定義 } return CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { SetWindowLong(Form1->Handle, GWL_WNDPROC, (LONG)OldForm1WndProc); } //---------------------------------------------------------------------------
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-13 13:44:55 IP:210.85.xxx.xxx 未訂閱
剛剛想到了辦法了~ 只要改成下面就行了~ 我真是笨阿~ ><~ Form1->Edit1->Text="抓到滑鼠右鍵壓下的訊息"; //這行就可以了 但除了這方法 還有別的方法嗎? 再問一下 CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam); 中的 FARPROC 是甚麼意義呢?
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-13 14:13:30 IP:203.73.xxx.xxx 未訂閱
引言: 剛剛想到了辦法了~ 只要改成下面就行了~ 我真是笨阿~ ><~ Form1->Edit1->Text="抓到滑鼠右鍵壓下的訊息"; //這行就可以了 但除了這方法 還有別的方法嗎? 再問一下 CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam); 中的 FARPROC 是甚麼意義呢?
builder78 你好:
(1)有很多種方法~~介紹你其中一種方法
   >
備註:
你可以自行查詢  >    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-04-26 22:41:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!