?? sendmessage() api 函數(shù)如何使用.txt
字號:
以 下 內(nèi) 容 節(jié) 選 自 我 的 書 《 Visual Basic編 程 晉 級 : ActiveX控 件 》 :
要 發(fā) 送 消 息 , 我 們 就 需 要 使 用 API函 數(shù) SendMessage。 這 個 函 數(shù) 的 定 義 如 下 :
Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
這 個 函 數(shù) 有 四 個 參 數(shù) , 它 們 的 含 義 如 下 :
第 一 個 參 數(shù) hwnd是 窗 口 句 柄 , 是 一 個 長 整 型 數(shù) 。 Windows給 每 個 控 件 一 個 編 號 , 這 個 編 號 就 稱 為 窗 口 句 柄 。 有 了 這 個 句 柄 , 我 們 就 可 以 告 訴 Windows我 們 要 控 制 哪 個 控 件 , 所 以 這 個 句 柄 在 API調(diào) 用 中 至 關(guān) 重 要 。 Visual Basic的 大 多 數(shù) 控 件 都 包 括 hwnd屬 性 , 如 下 拉 框 、 TreeView等 , 窗 體 也 有 這 個 屬 性 。 但 也 有 一 些 控 件 沒 有 這 個 屬 性 , 如 標 簽 控 件 。 沒 有 這 個 屬 性 就 無 法 利 用 Windows API函 數(shù) , 但 可 以 節(jié) 省 系 統(tǒng) 資 源 。
第 二 個 參 數(shù) 是 要 傳 遞 的 消 息 。 API文 檔 中 包 括 了 所 有 消 息 的 含 義 和 用 法 , 而 每 個 消 息 所 定 義 的 常 數(shù) 在 Win32api.txt中 有 可 以 找 到 。 使 用 SendMessage傳 遞 消 息 , 大 多 是 為 了 完 成 以 下 幾 個 工 作 :
1、 設(shè) 置 控 件 的 一 些 選 項 , 象 我 們 要 使 用 的 CB_SETDROPPEDWIDTH的 就 屬 于 這 種 情 況 。 盡 管 Visual Basic的 每 個 控 件 都 提 供 了 許 多 屬 性 , 但 仍 然 有 許 多 控 件 的 選 項 沒 有 包 括 在 其 中 。 而 這 些 選 項 中 的 大 多 數(shù) 都 可 以 利 用 SendMessage進 行 設(shè) 置 。
2、 獲 得 控 件 的 一 些 設(shè) 置 。 同 上 一 種 情 況 相 反 , 有 時 我 們 需 要 獲 得 控 件 的 一 些 設(shè) 置 , 這 相 當 于 讀 取 屬 性 。 例 如 , 如 果 想 知 道 一 個 下 拉 框 的 下 拉 部 分 的 寬 度 是 多 少 , 就 可 以 向 控 件 發(fā) 送 CB_GETDROPPEDWIDTH消 息 。 對 于 這 種 情 況 , SendMessage函 數(shù) 的 返 回 值 就 是 結(jié) 果 。
3、 執(zhí) 行 一 定 的 操 作 。 例 如 , 我 們 要 在 下 拉 框 中 尋 找 是 否 "ABC"這 個 字 符 串 。 當 然 , 我 們 可 以 編 寫 一 個 循 環(huán) , 逐 條 比 較 看 是 否 存 在 這 樣 的 字 符 串 。 如 果 使 用 API, 我 們 只 需 要 向 下 拉 框 發(fā) 送 CB_FINDSTRING消 息 , 這 條 消 息 就 會 自 動 進 行 查 找 工 作 并 返 回 結(jié) 果 。
4、 模 擬 用 戶 操 作 。 我 們 有 時 希 望 模 擬 用 戶 的 操 作 , 比 如 關(guān) 閉 其 他 應(yīng) 用 程 序 的 窗 口 。 其 實 只 要 我 們 能 知 道 那 個 窗 口 的 句 柄 , 我 們 就 可 以 發(fā) 送 WM_CLOSE消 息 給 那 個 窗 口 , 窗 口 接 受 到 這 條 消 息 就 會 關(guān) 閉 , 如 同 用 戶 關(guān) 閉 窗 口 一 樣 。
API消 息 的 妙 用 很 多 , 我 們 這 里 只 是 介 紹 如 何 使 用 SendMessage來 發(fā) 送 消 息 , 更 進 一 步 的 應(yīng) 用 就 留 給 讀 者 繼 續(xù) 探 索 了 。
SendMessage還 有 兩 個 參 數(shù) wParam和 lParam。 每 個 消 息 都 具 有 這 兩 個 參 數(shù) , 它 們 可 能 包 括 一 些 其 他 信 息 , 其 含 義 由 具 體 的 消 息 來 決 定 的 。 比 如 , 我 們 要 調(diào) 用 的 CB_SETDROPPEDWIDTH消 息 , 其 wParam 表 示 要 設(shè) 置 下 拉 部 分 的 寬 度 是 多 少 , 以 象 素 為 單 位 ; 而 lParam參 數(shù) 沒 有 使 用 , 必 須 設(shè) 置 為 0。
可 能 你 已 經(jīng) 注 意 到 了 , 這 里 SendMessage中 的 lParam定 義 為 Any類 型 。 前 面 我 們 已 經(jīng) 提 到 , 指 定 Any類 型 禁 止 Visual Basic進 行 類 型 檢 查 , 從 而 允 許 將 任 意 數(shù) 據(jù) 類 型 傳 遞 給 該 過 程 。 由 于 每 條 消 息 對 參 數(shù) 的 類 型 和 傳 遞 方 式 的 要 求 都 不 同 : 有 的 可 能 要 求 為 Long型 , 有 的 可 能 要 求 為 自 定 義 類 型 ; 大 多 數(shù) 要 求 按 傳 值 方 式 傳 遞 , 但 也 有 一 些 要 求 按 傳 地 址 方 式 。 為 了 滿 足 各 種 要 求 , 我 們 將 這 個 參 數(shù) 定 義 為 Any類 型 。 比 如 , 我 們 要 傳 遞 一 個 Long型 變 量 lData。 如 果 消 息 要 求 傳 地 址 方 式 傳 遞 , 可 以 使 用 :
SendMessage … … , lData
而 如 果 要 求 傳 值 方 式 傳 遞 , 則 使 用
SendMessage … … , ByVal lData
如 果 傳 遞 常 數(shù) , 我 們 則 需 要 使 用 類 型 后 綴 來 指 定 常 數(shù) 的 類 型 , 比 如 "0&", 表 示 Long型 的 常 數(shù) 0, 如
SendMessage … … , ByVal 0&
我 們 也 可 以 使 用 類 型 轉(zhuǎn) 換 函 數(shù) CLng將 常 數(shù) 指 定 為 Long型 , 如 CLng(0)。
<END>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -