看板 C_and_CPP 關於我們 聯絡資訊
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