DirectInput周期效果创建时设dwDuration为INFINITE 修改后无法停止问题
问题原因
- 第一个核心问题是
SetParameters调用的标志位缺少DIEP_DURATION:你只传了DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_START,DirectInput只会更新标志位指定的参数,你修改的本地dwDuration值不会同步到驱动层面,效果实际运行时长还是初始设置的INFINITE,自然不会自动停止。 - 第二个潜在问题是参数索引不匹配:你修改的是
jsInfo.periodic[p]的时长,但调用SetParameters时传的结构体是jsInfo.periodic[periodic].effect,如果p和periodic两个变量的值不一致,你传递的结构体根本不是你修改过时长的那一个,参数更新也不会生效。
解决思路
- 修正
SetParameters的标志位,追加DIEP_DURATION,明确告知API需要更新时长参数,同时保持参数索引一致,修改后的调用示例如下:
jsInfo.periodic[p].effect.dwDuration = duration * 1000; // 追加DIEP_DURATION标志,索引统一使用p HRESULT hr = jsInfo.periodic[p].pEffect->SetParameters(&jsInfo.periodic[p].effect, DIEP_DURATION | DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_START); // 如果之前已经启动过无限时长的效果,建议先停止再重新启动,避免驱动状态残留 // jsInfo.periodic[p].pEffect->Stop(); jsInfo.periodic[p].pEffect->Start(1, 0);
- 若需要排查问题,可以在调用
SetParameters后调用GetParameters读取驱动侧实际存储的效果参数,确认dwDuration已经更新为目标值。 - 部分老旧力反馈设备驱动对动态修改时长的兼容性较差,如果修正标志位后仍然无法生效,可以先释放原来的无限时长效果对象,用新的时长重新创建效果再启动,该方案兼容性最高。
内容的提问来源于stack exchange,提问作者ghiboz
相关产品推荐
相关产品推荐

