基 于 VB 平 台 的 游 戏 控 制 器 端 口 数 据 通 信 李 密 吕 钊 ( 空 军 第 一 航 空 学 院 电 子 工 程 系 464000) [ 摘 要 ] 本 文 详 细 分 析 了 API 函 数 调 用 的 基 本 方 法, 在 此 基 础 上 介 绍 了 如 何 实 现 游 戏 控 制 器 端 口 的 数 据 通 讯 [ 关 键 词 ]API, 窗 体, 工 程 TO ACHIEVE COMMUNICATIONS OF THE GAME CONTROLLER BASED ON VB LV-ZHAO LI-MI (The first Aeronautical College of Air-Force. 464000 Xinyang, Henan Province) [Abstract]This article introduces the way that how to apply API function, and analyzes the process of achieving communications of the game controller based on VB. [keywords]api, Form, Projector Visual Basic 是 Microsoft 推 出 的 功 能 强 大 的 集 成 式 开 发 环 境 它 以 其 易 学 易 用 深 受 广 大 电 脑 爱 好 者 的 喜 爱 在 使 用 VB 编 程 过 程 中, 我 们 经 常 需 要 调 用 Windows API 函 数 来 实 现 一 些 特 殊 的 功 能 Windows API 是 Windows 中 可 供 任 何 Windows 应 用 访 问 的 函 数 的 集 合, 它 包 含 了 成 千 上 万 的 函 数 例 程 类 型 和 常 数 定 义, 可 以 定 义 为 三 个 主 要 的 动 态 链 接 库 和 几 个 较 小 的 DLL Visual Basic 本 身 便 是 600 多 个 Windows API 函 数 轴 取 到 高 层 的 结 果, 而 Windows 提 供 的 所 有 功 能 几 乎 都 可 以 在 API 函 数 中 找 到 准 确 地 调 用 API 函 数 便 是 VB 编 程 的 精 髓 所 在 在 利 用 VB 进 行 精 确 图 像 处 理, 尤 其 是 在 编 写 仿 真 模 拟 应 用 软 件 时, 合 理 正 确 地 调 用 API 以 实 现 对 外 设 接 口 的 数 据 通 信 则 显 得 尤 为 重 要 笔 者 在 利 用 VB 开 发 某 飞 机 综 合 训 练 模 拟 器 过 程 中, 经 过 反 复 调 试, 实 现 了 通 过 调 用 API 函 数 来 即 时 读 取 游 戏 控 制 器 的 端 口 数 据, 并 由 此 控 制 飞 行 姿 态, 以 达 到 利 用 游 戏 控 制 器 来 模 拟 飞 机 操 纵 杆 的 目 的 经 调 试, 总 结 出 用 以 完 成 精 确 读 取 游 戏 控 制 器 端 口 数 据 的 方 法 一 API 函 数 的 调 用 要 调 用 API 函 数, 就 需 要 一 种 特 别 的 声 明, 这 种 声 明 比 一 般 变 量 声 明 要 复 1
杂, 它 们 被 称 为 Declare 语 句 Declare 语 句 一 般 具 有 两 种 可 能 的 形 式 对 于 DLL 中 的 子 程 序 ( 没 有 返 回 值 ), 使 用 如 下 Declare 语 句 : [Public/Private] Declare Sub name Lib libname [Alias_aliasname][(areglist)] 而 对 函 数 ( 有 返 回 值 ), 则 使 用 如 下 语 句 : [Public/Private] Declare Function name Lib libname [Alias_aliasname][As Type] 其 中 Lib 参 数 只 是 用 于 标 识 它 用 于 通 知 Visual Basic 要 调 用 的 一 个 DLL,libname 参 数 是 包 含 的 将 调 用 过 程 的 DLL 名 称,Alias 关 键 字 在 需 要 使 用 与 DLL 中 不 同 名 称 的 过 程 时 使 用 一 个 非 常 重 要 的 问 题 是 API 函 数 的 Declare 语 句 必 须 是 Windows 所 要 求 的 形 式, 如 果 省 略 了 ByVal 关 键 字, 一 般 会 使 系 统 发 生 死 锁 Visual Basic 专 业 版 和 企 业 版 的 一 个 很 好 的 特 性 就 是 它 们 提 供 了 一 个 Windows API 函 数 所 需 要 的 所 有 Declare 语 句 及 常 量 的 文 件 以 及 一 个 处 理 这 个 文 件 的 API Viewer 程 序 可 以 由 Visual Basic 项 目 组 或 直 接 从 VB 目 录 下 的 Winapi 子 目 录 或 通 过 使 用 Add_In Manager( 程 序 名 称 为 Aplioad.exe) 使 其 成 为 内 部 程 序 的 方 式 进 入 API 函 数 信 息 并 将 拷 贝 内 容 粘 到 应 用 程 序 中 调 用 API 函 数 具 体 步 骤 如 下 : 1 打 开 API Viewer 的 File 菜 单, 选 择 需 要 查 看 的 文 件 如 果 第 一 次 装 载 Win32api.txt 时,API Viewer 会 提 问 是 否 要 将 文 本 文 件 转 换 为 数 据 库 文 件, 这 样 可 以 使 速 度 有 所 提 高 ( 见 图 1 所 示 ) 2 在 装 载 了 文 本 文 件 后, 键 入 要 查 找 的 项 的 首 字 母, 从 API Type 列 表 框 中 选 择 图 1 需 要 查 看 的 API 部 分 (Delcares 常 量 等 等 ) 3 从 Available Items 列 表 框 中 选 择 所 需 的 项 4 点 击 Copy 按 钮 可 以 将 选 择 的 项 放 到 剪 切 板 中 ( 见 图 2 所 示 ) 5 移 动 代 码 窗 中 要 将 所 选 内 容 插 入 的 位 置, 选 择 Edit/Paste( 或 Ctrl+V) 以 将 相 应 的 内 容 从 剪 切 板 拷 贝 下 来 这 里 需 要 指 出, 为 了 慎 重 地 使 用 API 函 数, 必 须 建 立 所 需 文 档 以 说 明 使 用 了 哪 些 API 函 数 图 2 2
二 工 程 的 建 立 首 先 新 建 一 个 工 程, 保 存 为 control.vbp, 窗 体 命 名 为 control.frx, 向 窗 体 中 添 加 两 个 Line 控 件, 两 个 Timer 控 件 与 一 个 Label 控 件, 并 按 下 表 设 定 它 们 的 属 性 值 : 对 象 名 称 属 性 属 性 值 对 象 名 称 属 性 属 性 值 Form1 Timer1 Timer2 Label1 BackColor &H00000000& BorderColor &H0000FFFF& Height 4695 BorderWidth 2 Width 3495 X1 1920 Line1 Enable Ture X2 2880 Interval 100 Y1 2340 Enable Ture Y2 2340 Interval 100 BorderColor &H0000FFFF& Autosize Ture BorderWidth 2 Backstyle 0-Transparent X1 300 Caption 基 于 VB 平 台 上 的 游 戏 控 制 器 通 信 X2 1320 ForeColor &H00FF0000& Y1 2340 Font 楷 体 _GB2312 Top 180 Line2 Y2 2340 三 代 码 模 块 的 实 现 新 建 一 个 代 码 模 块, 同 样 命 名 为 control.bas, 利 用 上 述 方 法 在 模 块 中 声 明 变 量 : Public Type JOYINFO 图 2 wxpos As Long 游 戏 控 制 器 X 轴 坐 标 wypos As Long 游 戏 控 制 器 Y 轴 坐 标 wzpos As Long 游 戏 控 制 器 Z 轴 坐 标 wbuttons As Long 游 戏 控 制 器 的 按 钮 End Type Public Declare Function joysetcapture Lib "winmm.dll" (ByVal hwnd As Long, ByVal uid As Long, ByVal uperiod As Long, ByVal bchanged As Long) As Long 获 得 游 戏 控 制 器 的 控 制 权 Public Declare Function joysetthreshold Lib "winmm.dll" (ByVal id As Long, ByVal uthreshold As Long) As Long 设 置 游 戏 控 制 器 移 动 范 围 的 最 值 Public Declare Function joyreleasecapture Lib "winmm.dll" (ByVal id As Long) As Long 释 放 游 戏 控 制 器 所 得 的 数 据 3
Public Declare Function joygetpos Lib "winmm.dll" (ByVal ujoyid As Long, pji As JOYINFO) As Long 读 取 游 戏 控 制 器 的 数 据 四 利 用 游 戏 控 制 器 实 现 模 拟 飞 行 姿 态 在 窗 体 中 加 入 如 下 代 码 : Public y, j, h As Single Dim x1, y1, x2, y2 As Integer Dim ji As JOYINFO Dim r As Long 声 明 一 些 公 共 变 量 Private Sub Form_Load( ) Scale (-1688, 2474)-(1688, -1816) Dim ji As JOYINFO r = joysetthreshold(0, 1000) r = joysetcapture(me.hwnd, 0, 500, 1) r = joygetpos(0, ji) y = 0 h= 0 ' 在 载 入 窗 体 时 初 始 化 各 种 数 据 ' 定 义 窗 体 中 心 位 置 ' 初 始 化 操 纵 杆 数 据 Line1.x1 = -350 Line1.y1 = 0 Line1.x2 = -1100 Line1.y2 = 0 Line2.x1 = 350 Line2.y1 = 0 Line2.x2 = 1100 Line2.y2 = 0 ' 初 始 化 飞 机 姿 态 线 开 始 位 置 Private Sub Timer1_Timer() Dim t As Single r = joygetpos(0, ji) r = (ji.wxpos - 32760) / 10000 t = r * -1# ' 定 义 飞 机 姿 态 线 左 右 翻 转 4
t = t / 100# j = j + t Call Rotate Private Sub Timer2_Timer() r = joygetpos(0, ji) y = (ji.wypos - 32760) / 1000 Line1.y1 = Line1.y1 + y Line1.y2 = Line1.y2 + y Line2.y1 = Line2.y1 + y Line2.y2 = Line2.y2 + y h= h + y If ji.wbuttons = 1 Then Unload Me End If ' 定 义 飞 机 姿 态 线 上 下 运 动 当 按 下 按 钮 时 关 闭 该 窗 体 ( 具 体 的 按 钮 顺 序 可 以 在 控 制 面 板 中 游 戏 控 制 器 选 项 中 得 到 ) Sub Rotate() Line1.x1 = -350 * Cos(j) Line1.x2 = -1100 * Cos(j) Line1.y1 = 350 * Sin(j) + h Line1.y2 = 1100 * Sin(j) + h Line2.x1 = -Line1.x1 Line2.x2 = -Line1.x2 Line2.y1 = -350 * Sin(j) + h Line2.y2 = -1100 * Sin(j) + h 子 程 序 Private Sub Form_Unload(Cancel As Integer) Dim r As Long r = joyreleasecapture(0) ' 在 关 闭 窗 体 时 释 放 数 据 5
上 述 程 序 在 Windows 98 VB6.0 下 运 行 成 功 本 文 详 细 介 绍 了 如 何 使 用 API 函 数 实 现 对 游 戏 控 制 器 端 口 数 据 的 通 信 方 法 通 过 分 析 中 可 以 看 出, 调 用 不 同 的 API 函 数, 不 仅 可 以 实 现 游 戏 控 制 器 端 口 数 据 的 采 集, 而 且 还 可 以 实 现 对 声 卡 数 据 的 采 集 与 即 时 处 理, 并 可 以 通 过 一 些 数 学 公 式 来 计 算 出 相 应 的 声 卡 输 出 频 率 特 性 曲 线, 用 以 工 程 人 员 开 发 大 型 项 目 另 外, 本 文 还 详 细 介 绍 了 调 用 API 函 数 的 具 体 过 程, 掌 握 API 函 数 的 使 用 可 以 很 方 便 地 实 现 其 它 一 些 特 殊 任 务 如 : 鼠 标 的 中 断 事 件 鼠 标 左 右 键 的 互 换 是 否 设 置 键 盘 状 态 等 等, 有 利 于 开 发 人 员 创 建 大 型 应 用 项 目 主 要 参 考 书 目 1 Visual Basic 6.0 从 入 门 到 精 通 Gary Cornell 北 京 希 望 电 子 出 版 社 (1999) 2 Visual Basic 6.0 编 程 实 例 张 宏 林 人 民 邮 电 出 版 社 (1999) 3 微 型 计 算 机 原 理 及 应 用 ( 第 二 版 ) 郑 学 坚 清 华 大 学 出 版 社 (1995) 李 密 吕 钊 作 者 简 介 毕 业 于 郑 州 大 学 通 信 工 程 专 业, 现 任 空 军 第 一 航 空 学 院 讲 师, 主 要 研 究 方 向 为 通 信 导 航 与 软 件 开 发 毕 业 于 空 军 第 一 航 空 学 院 雷 达 工 程 专 业, 现 任 空 军 第 一 航 空 学 院 讲 师, 现 从 事 雷 达 信 号 处 理 作 者 通 信 地 址 : 河 南 信 阳 空 军 第 一 航 空 学 院 801# 邮 编 :464000 联 系 电 话 :0376-6572050 或 (0)13939719756 6