
简介本资源为Windows平台x64架构专用的HID设备开发核心库文件包面向嵌入式驱动开发者、外设应用工程师及系统级C/C程序员解决64位环境下调用标准人机接口设备如键盘、鼠标、游戏手柄等API时因库版本不匹配导致的链接失败、运行崩溃或设备识别异常等关键问题。压缩包共6个文件72KB含2个x64版静态库hid.lib、setupapi.lib与4个配套头文件hidsdi.h、hidusage.h、hidpi.h、setupapi.h覆盖设备枚举、报告读写、特征请求等完整HID交互链路所需符号定义与接口声明。目前已有70人学习下载资源结构精简聚焦无需安装即可直接集成至Visual Studio x64项目配合Windows SDK使用可快速实现设备状态监控、自定义输入解析与低延迟事件响应等典型功能显著降低跨平台HID开发门槛。1. 项目概述从“x64 版本的 hid.lib”说起如果你在开发一个需要与USB HID设备比如游戏手柄、自定义键盘、扫码枪或者一些工业控制面板打交道的Windows桌面应用并且你的开发环境已经升级到了64位x64那么你大概率会在某个编译或链接阶段遇到一个看似简单却让人头疼的问题找不到或者链接失败于“x64版本的hid.lib”。这个标题正是无数Windows底层设备交互开发者在项目从32位x86向64位x64迁移或者在新平台上启动项目时必然会撞上的第一堵墙。它不是一个独立的“项目”而是一个典型的、标志性的开发依赖问题背后牵扯到Windows驱动模型、SDK版本、编译工具链配置等一系列核心知识。简单来说hid.lib是微软Windows SDK中提供的一个静态库文件它包含了与“人机接口设备”进行交互的一系列核心API的函数声明和链接信息。你的程序代码里调用了诸如HidD_GetHidGuid、HidD_GetAttributes、HidD_GetPreparsedData等函数编译器在编译时知道这些函数的名字但到了链接阶段链接器需要知道这些函数具体在哪个二进制文件里、地址是多少才能生成最终的可执行文件。hid.lib就是这个“地址簿”。而“x64版本”特指这个库是针对64位CPU指令集和内存模型编译的与32位版本通常叫hid.lib但可能放在x86目录下在二进制格式上完全不兼容。直接使用错误的版本链接器会报出一堆“无法解析的外部符号”错误你的项目自然就无法成功构建。这个问题之所以值得用一篇长文来探讨是因为它绝不仅仅是“复制一个文件”那么简单。它像一扇门背后是整个Windows平台下硬件交互开发的生态和规范。解决它你需要理解Windows SDK的目录结构、Visual Studio的项目属性配置、不同构建配置Debug/Release和平台目标x86/x64/ARM64的匹配甚至还要追溯到WDKWindows Driver Kit的安装。对于新手这堆概念足以让人望而却步对于老手也可能因为开发环境变迁比如升级到Windows 11、新版VS2022而再次踩坑。接下来我将以一个资深开发者的视角带你彻底拆解这个问题从原理到实操从获取库文件到项目配置再到疑难排查让你不仅解决当前问题更能建立起一套应对类似平台依赖问题的通用方法论。2. 核心需求与场景深度解析为什么我们需要专门寻找和配置x64版本的hid.lib这背后是软件开发中“平台迁移”和“性能与内存寻址需求”的必然趋势。2.1 从x86到x64不可逆转的迁移浪潮早期的Windows应用和开发环境大多基于32位x86架构。32位系统有内存寻址限制通常最多4GB用户态地址空间在处理大量数据或复杂应用时逐渐力不从心。随着64位CPU的普及和Windows x64操作系统的成熟64位应用因其能突破内存限制、拥有更宽的寄存器和更优的性能成为了主流。尤其是需要处理大量设备数据、进行复杂实时计算如游戏引擎、工业控制软件、数据采集系统的HID设备应用迁移到x64平台几乎是必然选择。当你将Visual Studio中的项目“平台目标”从“Win32”改为“x64”时整个编译工具链都切换到了64位模式。此时链接器会去寻找64位版本的库文件。如果你没有正确配置它可能仍然在32位的库目录中搜索结果就是找不到符号。这就是最常见的错误根源项目平台与引用的库文件平台不匹配。2.2 HID设备交互的特殊性HID设备种类繁多从简单的键盘鼠标到复杂的VR控制器、医疗设备它们都遵循USB HID协议。在Windows上与这些设备进行底层通信绕过系统默认驱动进行直接读写、获取详细报表描述符等需要用到hid.dll提供的函数。这些函数并非标准的Win32 API而是由hid.dll这个系统动态库导出。hid.lib就是这个动态库的导入库。因此hid.lib是连接你的应用程序代码与系统底层HID服务的关键桥梁。2.3 典型应用场景游戏外设开发为自定义游戏手柄、方向盘、飞行摇杆编写配置软件或高级驱动需要读取设备序列号、厂商信息或发送特定功能报告。工业与实验室设备许多测量仪器、数据采集卡以HID设备形式出现上位机软件需要直接与其通信进行高速、稳定的数据交换。辅助工具与宏编程开发键盘鼠标模拟、宏录制工具或者为特殊键鼠设备开发增强功能。安全与测试工具测试USB HID设备兼容性或进行安全审计相关的设备枚举与通信分析。在这些场景下一个稳定、正确配置的开发环境是第一步。而hid.lib的配置正是这第一步中的关键一棋。3. 获取x64版本hid.lib的完整路径与方案你不可能从网上下载到一个孤立的、可信的hid.lib文件。它必须来自官方的、与你的开发环境匹配的Windows SDK。以下是几种可靠获取方案我将详细分析每种方案的适用场景和操作细节。3.1 方案一通过Visual Studio安装器安装完整Windows SDK推荐这是最规范、最一劳永逸的方法。无论你使用Visual Studio 2015、2017、2019还是2022都可以通过Visual Studio安装器来添加Windows SDK组件。操作步骤打开“Visual Studio Installer”。找到你已安装的Visual Studio版本点击“修改”。在“工作负载”选项卡中确保已勾选“使用C的桌面开发”。这是基础。切换到“单个组件”选项卡。在搜索框中输入“Windows SDK”。你会看到一系列SDK版本例如“Windows 10 SDK (10.0.19041.0)”、“Windows 11 SDK (10.0.22000.0)”等。选择一个较新且稳定的版本如10.0.19041.0或10.0.22621.0进行勾选。通常建议选择Windows 10 SDK的最新版本因为其兼容性最广。点击“修改”按钮等待安装完成。安装后库文件位置安装完成后x64版本的hid.lib通常位于以下目录C:\Program Files (x86)\Windows Kits\10\Lib\[SDK版本号]\um\x64\例如C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64\hid.lib注意路径中的[SDK版本号]就是你安装的具体版本号。um代表“User Mode”即用户态库这是我们开发应用程序所需要的。与之对应的是kmKernel Mode用于驱动开发。3.2 方案二单独下载Windows SDK离线安装包如果你的网络环境不适合通过VS安装器在线安装或者需要在没有安装Visual Studio的机器上配置构建环境可以前往微软官方下载中心搜索“Windows SDK”下载独立安装包。安装后库文件的位置与方案一相同。3.3 方案三从WDKWindows Driver Kit中获取hid.lib也包含在WDK中。如果你同时在进行驱动开发安装了WDK那么也可以从WDK的目录中找到它。路径类似C:\Program Files (x86)\Windows Kits\10\Lib\[SDK版本号]\km\x64\但是请注意WDK路径下的km目录中的库是用于编译内核模式驱动Kernel-Mode Driver的。虽然文件可能相同但为了规范起见开发应用程序用户态程序时强烈建议使用um目录下的库。两者在链接时理论上可能可以互换但遵循官方分类是最佳实践可以避免未来不可预见的兼容性问题。3.4 验证库文件找到文件后如何确认它就是x64版本一个简单的方法是查看文件属性或使用Visual Studio自带的工具。右键查看属性在文件资源管理器中右键点击hid.lib选择“属性”查看“详细信息”选项卡。通常描述中会提及平台。使用dumpbin工具打开“VS的开发人员命令提示符”导航到库文件所在目录运行dumpbin /headers hid.lib | findstr machine如果输出中包含x64或8664 machine (x64)则确认是64位库。如果显示14C machine (x86)则是32位库。4. 在Visual Studio项目中配置x64平台与hid.lib获取到正确的库文件只是第一步接下来需要在你的Visual Studio项目中正确配置。这里假设你已经创建或打开了一个C项目。4.1 创建或切换至x64平台配置打开你的项目在Visual Studio顶部的工具栏中找到“解决方案平台”下拉列表。如果里面只有“Win32”你需要添加x64平台。点击下拉列表选择“配置管理器...”。在“配置管理器”对话框中在“活动解决方案平台”下拉框中选择“新建...”。在“新建解决方案平台”对话框中选择“x64”通常可以从“Win32”设置复制这会把很多项目属性带过来比较方便。点击“确定”。关闭配置管理器。现在工具栏的“解决方案平台”应该可以看到“x64”选项请选择它。4.2 配置项目属性以链接hid.lib现在我们需要告诉链接器在x64平台下去哪里找hid.lib这个库文件。在“解决方案资源管理器”中右键点击你的项目选择“属性”。确保左上角的“配置”和“平台”分别是你当前要构建的配置如“Debug”或“Release”和“x64”。导航到“配置属性” - “链接器” - “输入”。在“附加依赖项”这一栏点击下拉箭头选择“编辑”。通常这里可能已经有一些库比如kernel32.lib等。在已有内容的后面注意换行添加hid.lib。如果之前是为Win32平台配置的请确保现在是在x64的属性页下进行修改。实操心得我习惯使用$(继承)宏然后再加上自己的库这样能确保继承项目默认设置。更清晰的做法是直接编辑添加hid.lib。注意这里只需要写库文件名不需要写路径。接下来需要告诉链接器hid.lib所在的目录。导航到“链接器” - “常规”。找到“附加库目录”点击编辑。在这里你需要添加hid.lib所在的目录路径。例如添加C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64。重要提示为了避免硬编码路径增强项目在不同机器上的可移植性强烈建议使用Windows SDK提供的环境变量。你可以使用$(WindowsSdkDir)宏。因此更优的写法是$(WindowsSdkDir)Lib\$(WindowsTargetPlatformVersion)\um\x64。这样无论SDK安装在哪版本号是多少Visual Studio都会自动解析为正确的路径。点击“应用”然后“确定”保存属性修改。4.3 包含头文件除了链接库还需要在代码中包含正确的头文件。在你的源代码文件通常是.cpp文件中添加以下包含语句#include windows.h #include hidsdi.h // 这是主要的HID头文件windows.h是必须的它定义了许多基础类型和宏。hidsdi.h包含了所有HID设备接口的函数声明和数据结构。确保你的“附加包含目录”在“C/C” - “常规”属性页中包含了Windows SDK的头文件目录通常由$(WindowsSdkDir)Include\$(WindowsTargetPlatformVersion)\um等宏自动管理一般无需手动添加。5. 编写一个简单的验证程序配置完成后如何验证一切工作正常最好的办法是写一段简单的代码来测试。下面是一个最简单的示例它枚举当前系统连接的所有HID设备并打印出它们的厂商ID和产品ID。#include windows.h #include hidsdi.h #include setupapi.h // 用于设备信息集操作 #include iostream #include vector #pragma comment(lib, setupapi.lib) // 链接SetupAPI库用于设备枚举 int main() { HDEVINFO deviceInfoSet; SP_DEVINFO_DATA deviceInfoData; SP_DEVICE_INTERFACE_DATA interfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA detailData NULL; GUID hidGuid; DWORD memberIndex 0; DWORD requiredSize 0; // 1. 获取HID设备的GUID HidD_GetHidGuid(hidGuid); // 2. 获取所有HID设备接口的信息集 deviceInfoSet SetupDiGetClassDevs(hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (deviceInfoSet INVALID_HANDLE_VALUE) { std::cerr Failed to get device info set. Error: GetLastError() std::endl; return 1; } // 3. 遍历设备 deviceInfoData.cbSize sizeof(SP_DEVINFO_DATA); interfaceData.cbSize sizeof(SP_DEVICE_INTERFACE_DATA); while (SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, hidGuid, memberIndex, interfaceData)) { memberIndex; // 获取设备接口详情所需的缓冲区大小 SetupDiGetDeviceInterfaceDetail(deviceInfoSet, interfaceData, NULL, 0, requiredSize, NULL); if (requiredSize 0) continue; detailData (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize); if (!detailData) continue; detailData-cbSize sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); deviceInfoData.cbSize sizeof(SP_DEVINFO_DATA); if (SetupDiGetDeviceInterfaceDetail(deviceInfoSet, interfaceData, detailData, requiredSize, NULL, deviceInfoData)) { // 4. 打开设备句柄 HANDLE hDevice CreateFile( detailData-DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // 或0用于同步I/O NULL ); if (hDevice ! INVALID_HANDLE_VALUE) { HIDD_ATTRIBUTES attributes; attributes.Size sizeof(HIDD_ATTRIBUTES); // 5. 获取设备属性 if (HidD_GetAttributes(hDevice, attributes)) { std::cout HID Device Found: std::endl; std::cout Vendor ID: 0x std::hex attributes.VendorID std::endl; std::cout Product ID: 0x std::hex attributes.ProductID std::endl; std::cout Version Number: std::dec attributes.VersionNumber std::endl; std::cout Device Path: detailData-DevicePath std::endl; std::cout std::string(50, -) std::endl; } CloseHandle(hDevice); } } free(detailData); detailData NULL; } // 6. 清理 if (GetLastError() ! ERROR_NO_MORE_ITEMS) { std::cerr Enumeration error: GetLastError() std::endl; } SetupDiDestroyDeviceInfoList(deviceInfoSet); std::cout Enumeration finished. Total devices: memberIndex std::endl; return 0; }代码关键点解析HidD_GetHidGuid获取系统定义的HID设备类GUID这是枚举的起点。SetupDiGetClassDevs根据GUID创建一个设备信息集DIGCF_PRESENT确保只枚举当前已连接的设备。SetupDiEnumDeviceInterfaces和SetupDiGetDeviceInterfaceDetail这对函数是Windows设备枚举的核心。前者遍历设备接口后者获取设备的详细路径信息。DevicePath是后续CreateFile打开设备的关键。CreateFile是的在Windows上打开一个设备就像打开一个文件一样。获取到的设备句柄hDevice用于后续所有HID通信。HidD_GetAttributes这是hid.lib导出的核心函数之一用于获取设备的基本属性即VID、PID和版本号。错误处理每一步都检查返回值或GetLastError()是编写健壮设备程序的基础。将这段代码复制到你的x64项目中编译并运行。如果成功输出你电脑上连接的HID设备列表键盘、鼠标等都会列出那么恭喜你x64版本的hid.lib配置完全成功你的开发环境已经就绪。6. 高级配置与跨平台构建考量对于实际项目尤其是团队协作或需要持续集成CI的项目配置管理需要更加严谨和自动化。6.1 使用属性表.props文件管理配置手动为每个项目的每个平台配置库目录和依赖项非常繁琐且容易出错。Visual Studio的属性表是解决这个问题的利器。在“视图”菜单中打开“属性管理器”。在属性管理器中展开你的项目右键点击“Debug | x64”配置选择“添加新项目属性表”。命名为HID_x64.props并保存到一个合适的位置如解决方案目录下的props文件夹。双击这个新创建的属性表像之前配置项目属性一样在“链接器”-“输入”中添加hid.lib在“链接器”-“常规”的“附加库目录”中添加$(WindowsSdkDir)Lib\$(WindowsTargetPlatformVersion)\um\x64。保存。现在任何链接了这个属性表的x64 Debug配置项目都会自动包含这些设置。为“Release | x64”等其他配置也创建或链接相应的属性表。这样做的好处是配置集中管理一处修改处处生效。新加入的项目只需要添加对这个属性表的引用即可。6.2 处理ARM64平台随着Windows on ARM设备的普及如Surface Pro X为应用添加ARM64构建目标的需求也在增长。hid.lib同样有ARM64版本。其配置逻辑与x64完全一致只是路径中的平台目录变为arm64。库文件路径示例$(WindowsSdkDir)Lib\$(WindowsTargetPlatformVersion)\um\arm64\hid.lib在Visual Studio中创建ARM64平台配置然后在对应的项目属性或属性表中将附加库目录指向arm64目录即可。你的设备枚举代码是平台无关的只要使用正确的库就能为ARM64架构编译。6.3 CMake项目中的配置如果你的项目使用CMake作为构建系统配置方式有所不同但原理相通。你需要在CMakeLists.txt文件中明确指定链接库和包含目录。cmake_minimum_required(VERSION 3.10) project(MyHidApp) set(CMAKE_CXX_STANDARD 11) # 定义目标 add_executable(MyHidApp main.cpp) # 查找 Windows SDK find_package(WindowsSDK REQUIRED) # 这是一个简化示例实际可能需要更复杂的查找逻辑 # 更通用的方法是直接指定库路径使用环境变量或预定义路径 set(WINDOWS_SDK_DIR $ENV{WindowsSdkDir}) set(WINDOWS_SDK_VERSION $ENV{WindowsSDKVersion}) # 可能需要修剪版本号字符串 # 为不同平台设置不同的库目录 if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64-bit if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64) set(HID_LIB_DIR ${WINDOWS_SDK_DIR}Lib/${WINDOWS_SDK_VERSION}/um/arm64) else() set(HID_LIB_DIR ${WINDOWS_SDK_DIR}Lib/${WINDOWS_SDK_VERSION}/um/x64) endif() else() # 32-bit set(HID_LIB_DIR ${WINDOWS_SDK_DIR}Lib/${WINDOWS_SDK_VERSION}/um/x86) endif() # 添加链接库 target_link_libraries(MyHidApp ${HID_LIB_DIR}/hid.lib setupapi.lib # SetupAPI库也需要链接 ) # 添加包含目录 target_include_directories(MyHidApp PRIVATE ${WINDOWS_SDK_DIR}Include/${WINDOWS_SDK_VERSION}/um ${WINDOWS_SDK_DIR}Include/${WINDOWS_SDK_VERSION}/shared )CMake的配置更加灵活但也更复杂。关键在于正确获取Windows SDK的路径和版本并根据目标平台选择正确的库目录。7. 深度排查当配置正确却依然链接失败时即使你确信库路径和平台配置都正确有时仍然会遇到诡异的链接错误。以下是一些高级排查思路。7.1 错误 LNK2019: 无法解析的外部符号这是最常见的错误。如果错误指向HidD_*系列函数请按以下顺序检查检查平台一致性三重确认项目属性页左上角确认“配置”和“平台”与你当前要构建的目标完全一致如“Debug | x64”。解决方案平台下拉框确认选中的是“x64”。配置管理器检查每个项目的平台是否都设置为“x64”。在解决方案有多个项目时有时会混用平台。检查“附加依赖项”的继承与覆盖在项目属性 - 链接器 - 输入 - 附加依赖项中点击“编辑”后查看是否使用了$(继承)。有时在更高级别的配置如“所有配置”中设置了错误的库会被继承下来。可以尝试暂时清空只填入hid.lib进行测试。检查是否有属性表.props在更早或更晚的时机覆盖了你的设置。属性管理器的顺序很重要下层的属性表会覆盖上层的。检查库文件本身使用dumpbin /exports hid.lib命令查看该库文件是否确实导出了你报错的函数名如_HidD_GetAttributes4。注意C风格的函数名在库中可能会被修饰Decorated。hid.lib是C接口修饰相对简单通常是_函数名参数大小。如果dumpbin的输出中没有对应的符号说明这个库文件可能不完整或版本不对。运行时库Runtime Library冲突导航到“C/C” - “代码生成” - “运行时库”。确保你的项目设置与hid.lib编译时所使用的运行时库一致。通常/MDdDebug多线程DLL用于Debug配置/MDRelease多线程DLL用于Release配置。如果hid.lib是用静态运行时库/MT或/MTd编译的而你的项目设置是动态的就可能产生链接冲突。Windows SDK中的库通常使用/MD和/MDd所以保持项目默认设置即可。如果项目是从旧版本迁移或使用了特殊的三方库需要特别注意这一点。7.2 错误 LNK1104: 无法打开文件“hid.lib”这个错误明确表示链接器找不到hid.lib文件。检查“附加库目录”路径确认路径拼写完全正确特别是x64文件夹名。确认路径中的SDK版本号文件夹确实存在。有时安装了多个SDK版本版本号可能不对。强烈建议使用环境变量宏$(WindowsSdkDir)Lib\$(WindowsTargetPlatformVersion)\um\x64。你可以在项目属性的“VC目录” - “库目录”中查看这些宏的具体值或者在“预生成事件”中用echo命令打印出来调试。检查文件权限虽然不常见但可以检查一下hid.lib文件是否有读取权限。通常位于Program Files (x86)下需要管理员权限才能修改但读取应该没问题。检查项目生成事件查看项目属性中是否有“预链接事件”或“生成事件”在尝试复制或移动库文件但命令执行失败了。7.3 使用依赖项查看器Dependency Walker或dumpbin对于更复杂的链接问题可以使用dumpbin工具进行深入分析。查看可执行文件的导入表编译成功后对生成的.exe文件运行dumpbin /imports YourApp.exe。在输出中你应该能看到它从HID.DLL导入了哪些函数。这可以最终确认链接是否正确。对比不同平台分别用x86和x64配置编译一个简单的测试程序然后用dumpbin /headers查看两个exe的“machine”字段确认一个是x86一个是x64。再用dumpbin /imports对比它们导入的DLLx64版本的应该从System32下的64位hid.dll导入而x86版本从SysWOW64下的32位hid.dll导入。8. 从hid.lib延伸理解Windows HID编程的核心成功配置hid.lib只是开始。要真正用好HID设备你需要理解Windows HID编程模型。这里补充几个关键概念它们都依赖于hid.lib提供的函数。8.1 报表描述符Report Descriptor的解析HID设备的能力完全由其报表描述符定义。这是一个复杂的二进制数据结构描述了设备有哪些功能用法页、用法ID、数据格式输入、输出、特征报表等。hid.lib提供了HidP_*系列函数如HidP_GetCaps,HidP_GetButtonCaps,HidP_GetValueCaps来解析这个描述符。获取设备能力是进行任何有意义通信的前提。8.2 重叠I/O与异步通信在打开设备句柄时我使用了FILE_FLAG_OVERLAPPED标志。这允许你使用重叠I/O进行异步读写这对于需要高响应速度或同时处理多个设备的应用至关重要。你需要使用ReadFileEx/WriteFileEx配合完成例程或者使用GetOverlappedResult来管理异步操作。同步I/O标志为0在简单场景下也可以但可能会阻塞线程。8.3 设备通知如果你的应用需要实时感知HID设备的插拔可以使用RegisterDeviceNotification函数来注册设备变更通知。当设备连接或断开时你的窗口会收到WM_DEVICECHANGE消息。这在需要动态管理设备列表的应用程序中非常有用。8.4 权限问题在Windows Vista及更高版本上由于UAC的存在访问某些系统HID设备如键盘、鼠标可能需要提升的权限以管理员身份运行。对于自定义的HID设备通常不需要。如果遇到“拒绝访问”的错误ERROR_ACCESS_DENIED尝试以管理员身份运行你的程序。配置x64版本的hid.lib就像为你的HID开发之旅拿到了正确的钥匙和地图。它本身不复杂但涉及到的环境配置、工具链理解却是一个Windows C开发者基本功的体现。我个人的经验是建立一个干净、规范的开发环境配置比如使用属性表并充分理解每一步配置背后的原因远比死记硬背某个特定路径要重要得多。当你在x64、ARM64甚至未来新的平台上都能游刃有余地配置好开发环境时你才能真正专注于设备交互逻辑本身去实现那些更有趣、更强大的功能。最后一个小技巧把你项目中所有与平台相关的路径都替换成$(WindowsSdkDir)这样的环境变量宏并把属性表纳入版本控制这会让你的团队协作和项目迁移变得异常轻松。本文还有配套的精品资源点击获取