# HKMOpen

名称 | HKMOpen 打开设备
功能 | 打开无涯键鼠盒子，以便对它进行操作。使用相对鼠标时（注意相对鼠标和相对移动的区别），当系统中屏幕或鼠标的设置发生变化时，需要重新打开设备（先关闭设备再打开设备）。比如：屏幕分辨率或屏幕DPI(缩放)变化、鼠标指针速度或“提高指针精确度”变化。

参数

参数1　设备ID：无符号32位整型数。使用HKMSearchDevice或者HKMSearchDevice2可以获得它。
参数2　DPI模式：无符号32位整型数。用于设置鼠标移动（HKMMoveTo和HKMMoveR2）和获得鼠标坐标（HKMGetCursorPos和HKMGetCursorPos2）时使用的坐标的DPI模式。系统为了支持程序界面缩放，使用了不同坐标，不同DPI模式对应不同坐标计算方式。DPI模式中的前三种都是windows系统中的模式，可查微软资料了解详细内容，后面几种是这三种模式的变化。可取值：

值 | 说明
--- | ---
0 | 每个显示器DPI感知，此模式不受系统DPI设置和显示器DPI设置影响，每个坐标与显示器像素是一一对应的，windows系统从WIN8.1开始支持此模式，WIN8.1以前等效于系统DPI感知。
1 | 系统DPI感知。在WIN8.1以前的系统中每个坐标与显示器像素是一一对应的，在WIN8.1及WIN8.1以后的系统中由于每个显示器可以设置不同DPI，每个坐标与显示器像素不总是一一对应关系，如果只有一个显示器，且开机、重启、注销重登录后没改过DPI，每个坐标与显示器像素还是一一对应的。
2 | 无DPI感知，进程没有处理DPI缩放时的状态。进程把系统DPI和显示器DPI当成是100%时的状态。缩放由系统处理，明显看到的现象是：如果DPI是100%时一切正常，如果DPI不是100%此时会导致程序界面模糊。
3 | DPI不可用，这个模式的主要目的是不释放和执行DPI检测进程。在符合的条件下，等效于每个显示器DPI感知；在不符合的条件下，DPI变换可能无法正常工作。符合的条件是：在WIN8.1以前的系统中系统DPI是100%或者当前上下文的DPI感知是系统DPI感知，在WIN8.1及WIN8.1以后的系统中所有显示器DPI是100%时或当前上下文的DPI感知是每个显示器DPI感知时可正常工作。
4 | 当前上下文的DPI感知。根据当前上下文决定DPI感知。

返回值 | 无类型指针。创建的设备对象，也可以看成句柄。失败返回NULL。不再使用它时用HKMClose可以关闭它以释放资源。WIN10以前的系统常见的失败原因是由于安全软件拦截或者系统权限问题导致DPI进程启动失败，可以把参数2设置为3禁用模块对DPI的支持解决这个问题。
C语言 例子 | DWORD dwDevId; LPVOID lpDev; dwDevId=HKMSearchDevice(0x1234,0xABCD,0); if(dwDevId==0xFFFFFFFF) { printf("未找到无涯键鼠盒子\n"); return 0; } lpDev=HKMOpen(dwDevId,0); if(lpDev==NULL) { printf("打开无涯键鼠盒子失败\n"); return 0; } //执行操作 HKMClose(lpDev);