MSG 的問題 |
尚未結案
|
firewing
一般會員 發表:23 回覆:47 積分:19 註冊:2002-12-13 發送簡訊給我 |
請問各位大大:
我以下面此種方式攔截訊息
//main.h
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_CHAR, MSG , test)
END_MESSAGE_MAP(TForm) //main.cpp
void __fastcall TForm1::test(MSG m)
{
//TODO: Add your source code here
if(m.message==WM_CHAR) //
int i=10;
}
上面的寫法 int i=10 都不會被執行到...
為什麼 m.message 會等於我所按下鍵的 ASCII CODE
我查 BCB的 MSDN 所定義的 WM_CHAR
m.message 應該是訊息本身才對,而 m.wParam 才是 ASCII CODE
是哪裡有錯誤嗎???
我知道若宣告為 TMessage m 之後 m.Msg 會等於訊息,
我只是無聊想試試看以 MSG 的方法,只是一直都不太正確...
謝謝各位.... 發表人 - firewing 於 2003/04/04 17:55:02 發表人 - firewing 於 2003/04/04 17:56:06
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
typedef struct tagMSG { // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG; struct TMessage {
Cardinal Msg;
union
{
struct
{
Word WParamLo;
Word WParamHi;
Word LParamLo;
Word LParamHi;
Word ResultLo;
Word ResultHi;
};
struct
{
int WParam;
int LParam;
int Result;
};
};
} ; 兩個做比較, 你該知道為什麼了吧, 在結構上 MSG 是位於第二個欄位(正確的說法是要算記意體的 offset), 對應的正好是 wParam 的位置, 下次記得查 help 吧. Jesse Chan
------
Jesse Chan |
firewing
一般會員 發表:23 回覆:47 積分:19 註冊:2002-12-13 發送簡訊給我 |
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
有問題的地方在這裡
VCL_MESSAGE_HANDLER(WM_CHAR, MSG , test)
第二個參數的 type 是 TMessage, 你如果硬要把它 casting 成 MSG 在 compile 時不會出錯, 但是如同我上面所列的, MSG 和 TMessage 的結構並不相同, 請你仔細比對一下, 就會發現為什麼你的數值會被填錯地方了.
以下是一個例子.
...
public:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_MOUSEMOVE,TMessage,OnMouseMove);
END_MESSAGE_MAP(TCustomPanel);
... private:
void __fastcall OnMouseMove(TMessage &Message); Jesse Chan
------
Jesse Chan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |