攔截窗口消息的示例 |
作者:bb88 文章來源:本站原創(chuàng) 點(diǎn)擊數(shù):88 更新時(shí)間:2009/5/8 21:58:23 ![]() |
易語言等可視化編程已經(jīng)將視窗消息封裝為對象的屬性、方法和事件。 當(dāng)我們在窗口中按下鼠標(biāo)左鍵,欲出現(xiàn)信息“你點(diǎn)擊了窗體”,在易語言中是這樣編寫的: 子程序:__啟動窗口_鼠標(biāo)左鍵被按下返回值類型:邏輯型 信息框 (“你點(diǎn)擊了窗體”, 0, ) 但是如果不用“__啟動窗口_鼠標(biāo)左鍵被按下”事件能否達(dá)到這樣的結(jié)果?由于對象的事件也只不過是視窗消息的封裝,所以我們可以用視窗消息實(shí)現(xiàn)這樣的功能。 我們需要用到兩個(gè)API函數(shù):攔截窗口消息函數(shù)SetWindowLongA(置窗口信息)、回調(diào)函數(shù)CallWindowProcA(調(diào)窗口信息)。SetWindowLongA用于隨時(shí)攔截各種窗口消息,通過判斷不同的消息類型執(zhí)行不同的代碼(類似于易語言“事件”的作用);CallWindowProcA用于沒有出現(xiàn)需要的消息類型時(shí),將程序的消息返回到操作系統(tǒng)中,使操作系統(tǒng)繼續(xù)用SetWindowLongA來攔截窗口消息。 請看下面的示例代碼: Dll命令:置窗口信息返回值類型:整數(shù)型 Dll命令:調(diào)窗口信息返回值類型:整數(shù)型 常量:窗信_系統(tǒng)命令 值:274 備注:WM_SYSCOMMAND 窗口程序集:窗口程序集1 子程序:__啟動窗口_創(chuàng)建完畢 指針 = &回調(diào)信息 舊窗口信息 = 置窗口信息 (取窗口句柄 (), -4, 指針) 子程序:回調(diào)信息返回值類型:整數(shù)型備注:回調(diào)列表框 判斷 (信息類型 = #窗信_鼠標(biāo)按下) 判斷 (信息類型 = #窗信_系統(tǒng)命令) 如果 (值1 = 61536) 返回 (調(diào)窗口信息 (舊窗口信息, 窗口句柄, 信息類型, 值1, 值2)) 判斷結(jié)束 返回 (0) 子程序:_按鈕1_被單擊 結(jié)束 () |