在Windows上使用DirectInput而不需要窗口的C++?

3

简要版:

如果我没有访问HWND/HINSTANCE,该如何初始化和使用DirectInput?

背景信息:

我目前正在使用SFML来创建窗口等程序的大部分部分。它的工作非常好。但是我对SFML的输入系统不完全满意(例如,我想为XBox 360游戏手柄使用XInput),因此我想编写自己的输入系统。

我已经编写了XInput部分,但是对于其他游戏手柄/操纵杆等,我还需要DirectInput。由于SFML隐藏了与Windows相关的代码(这样做是正确的),因此我无法访问hwnd或hinstance。我该怎么使用DirectInput呢?也许一直捕获输入,而不仅仅是在窗口处于活动状态时? (然后我可以根据窗口的(de)activated事件进行过滤。)

谢谢,

Wonko先生

2个回答

3

找回窗口并不太难,使用EnumThreadWindows()和GetCurrentThreadId()。

请注意,DirectInput在任何地方都不需要窗口句柄。只需要在DirectInput8Create()中使用实例句柄。对于一个SFML应用程序,GetModuleHandle(NULL)很好用。


谢谢,那就够了。不过想一想...不,输入系统是在创建任何窗口之前初始化的(我宁愿不改变这个)。有没有一种方法可以在没有窗口的情况下使用DirectInput? - Mr. Wonko
你需要窗口句柄的地方在哪里?DirectInput8Create() 不需要,CreateDevice() 也不需要。 - Hans Passant
哦,没错!hinstance 显然就足够了。经过研究,似乎只需调用 GetModuleHandle(NULL) 就可以了。感谢您的帮助,现在我应该能做到了。 - Mr. Wonko
1
窗口句柄是设置协作级别所必需的。 - Valentin Perrelle

1

要获取HINSTANCE,您可以调用:GetModuleHandle(NULL)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接