作者noodleT (麵T)
看板C_and_CPP
標題[問題] 除錯器加 MouseHook
時間Thu Aug 27 22:13:40 2015
BCB 6.0
//定義.h
//全域變數
extern int DBG__LINE__;
extern char DBG__FILE__[1024];
extern char DBG__FUNC__[1024];
//定義 DBG
#ifndef DebugH
#define DebugH
void debug(char *fmt, ...);
#define DBG\
{\
DBG__LINE__ = __LINE__;\
strcpy(DBG__FILE__,__FILE__);\
strcpy(DBG__FUNC__,__FUNC__);\
}debug
#endif
//實作.cpp
void debug(char *fmt, ...)
{
//儲存錯誤資訊 DBG__LINE__, DBG__FILE__ ...
}
//應用.cpp
void 按鈕事件()
{
DBG("儲存訊息",);//舉例這裡行號為第20行
}
以上在儲存除錯訊息時可以自動補上行號(20)、檔名(應用.cpp)
在真正執行 debug() 副程式前先記錄目前行號、檔名
但缺點就是每個按鈕事件都要寫DBG
所以想加掛勾進去
SetWindowsHookEx
( WH_MOUSE_LL,
(HOOKPROC)
DBG_AUTO,
GetModuleHandle
(NULL),
NULL
);
但這樣一來就無法用類似的方法
#define
DBG_AUTO\
{\
DBG__LINE__ = __LINE__;\
strcpy(DBG__FILE__,__FILE__);\
strcpy(DBG__FUNC__,__FUNC__);\
}LowLevelMouseProc
來先行取得行數、檔名等等
(其實我也不確定 #define DBG 紅色部分寫法是否正確)
請問用掛勾(Hook)要怎麼取得進入掛勾前的行數、檔名資料呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.27.2.150
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1440684823.A.82B.html
→ dritchie: 沒辦法 08/27 23:39
→ noodleT: 那退一步想,有沒有辦法得知按鈕名稱? 08/27 23:42
→ noodleT: 我目前可以得到hwnd classname 08/27 23:43
→ noodleT: button_caption 08/27 23:44
→ noodleT: 但是無法得到 button name 08/27 23:45
→ TobyH4cker: Enum 08/29 07:39
噓 TobyH4cker: GetClassName 08/29 07:42
GetClassName 最終只能得到 "TButton" 這個字串,並無法區分是哪個按鈕
→ TobyH4cker: 按錯sorry 08/29 07:42
→ TobyH4cker: 你是想要一次hook所有按鈕然後按下時debug訊息自動抓 08/29 07:45
→ TobyH4cker: 取class name吧? 08/29 07:45
推 TobyH4cker: 提供你一個比較容易的方法,建一個ButtonOnMouseDown 08/29 08:20
→ TobyH4cker: 事件,第一個參數TObject *Sender轉型成TButton *btn 08/29 08:20
→ TobyH4cker: ,然後直接對btn存取物件資料還有輸出debug訊息,接著 08/29 08:20
→ TobyH4cker: 你只需要對所有Form上所有的Button設定OnMouseDown事 08/29 08:20
→ TobyH4cker: 件,就能達成了 08/29 08:20
看來要 debug 只能在每個按鈕事件中手動寫下要除錯的資訊。
※ 編輯: noodleT (36.237.231.124), 08/30/2015 21:08:22
→ TobyH4cker: 一個OnMouseDown可以設定到所有Button上啊,VCL也有提 08/31 07:53
→ TobyH4cker: 供遍歷所有元件的方法讓你一次套用 08/31 07:53