builder78
初階會員
發表:36 回覆:100 積分:47 註冊:2003-02-03
發送簡訊給我
|
我想用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
發送簡訊給我
|
引言:
我想用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
發送簡訊給我
|
恩~~ 還是版主有經驗~ 寫程式可真是要注意很多規定~
明明知道原理~ 稍微一點不符合規定 就不會讓你編譯成功
API定義一堆型別~ BCB 也自訂一堆型別~ 有時真不知該選哪個型別~~
真是傷腦筋耶~
|
builder78
初階會員
發表:36 回覆:100 積分:47 註冊:2003-02-03
發送簡訊給我
|
再請問一下 若處理訊息中 有用到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
發送簡訊給我
|
剛剛想到了辦法了~ 只要改成下面就行了~ 我真是笨阿~ ><~
Form1->Edit1->Text="抓到滑鼠右鍵壓下的訊息"; //這行就可以了
但除了這方法 還有別的方法嗎? 再問一下
CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam);
中的 FARPROC 是甚麼意義呢?
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
剛剛想到了辦法了~ 只要改成下面就行了~ 我真是笨阿~ ><~
Form1->Edit1->Text="抓到滑鼠右鍵壓下的訊息"; //這行就可以了
但除了這方法 還有別的方法嗎? 再問一下
CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam);
中的 FARPROC 是甚麼意義呢?
builder78 你好:
(1)有很多種方法~~介紹你其中一種方法
>
備註:
你可以自行查詢 > --
------ -- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
|