{"id":3065,"date":"2015-06-24T08:04:49","date_gmt":"2015-06-24T08:04:49","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3065"},"modified":"2015-07-21T07:56:23","modified_gmt":"2015-07-21T07:56:23","slug":"entrees-clavier-et-souris-avec-directinput","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3065","title":{"rendered":"Entr\u00e9es clavier et souris avec DirectInput"},"content":{"rendered":"<div class=\"entry-content\">\n<p>&nbsp;<\/p>\n<p><strong><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/souris.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3074\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/souris.jpg\" alt=\"souris\" width=\"247\" height=\"247\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/souris.jpg 500w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/souris-150x150.jpg 150w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/souris-300x300.jpg 300w\" sizes=\"(max-width: 247px) 100vw, 247px\" \/><\/a><\/strong><\/p>\n<p><strong>Intro : <\/strong><\/p>\n<p><strong>DirectInput<\/strong> est un composant de DirectX qui permet de g\u00e9rer les entr\u00e9es clavier (touches) et de la souris (position).<\/p>\n<p>Bien qu\u2019il soit tendance \u00e0 n\u2019\u00eatre plus utilis\u00e9, il est toujours utile car il permet de capturer <strong>directement les entr\u00e9es clavier<\/strong> \u00e0 partir des drivers p\u00e9riph\u00e9riques correspondants.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir un peu lire du C++.<\/p>\n<p>&#8211; Savoir initialiser DirectX 10.1.<\/p>\n<p>&#8211; Savoir utiliser la classe Singleton.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le fichier InputManager.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef INPUT_MANAGER_H\r\n#define INPUT_MANAGER_H\r\n\r\n#define DIRECTINPUT_VERSION 0x0800\r\n\r\n#include &lt;dinput.h&gt;\r\n#include &lt;map&gt;\r\n#include &lt;vector&gt;\r\n\r\n#include &quot;Singleton.h&quot;\r\n#include &quot;System.h&quot;\r\n\r\nclass KeyEvent\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0KeyEvent(int kc, wchar_t txt) : key(kc), text(txt) {}\r\n\u00a0\u00a0 \u00a0virtual ~KeyEvent() {}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ L'ID de la touche\r\n\u00a0\u00a0 \u00a0const int key;\r\n\u00a0\u00a0 \u00a0\/\/ La caract\u00e8re correspondant de la touche\r\n\u00a0\u00a0 \u00a0const wchar_t text;\r\n};\r\n\r\nclass KeyListener\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0virtual ~KeyListener() {}\r\n\r\n\u00a0\u00a0 \u00a0virtual void RepetitiveKeyPressed(const KeyEvent &amp;arg) = 0;\r\n\u00a0\u00a0 \u00a0virtual void RepetitiveKeyReleased(const KeyEvent &amp;arg) = 0;\r\n\r\n\u00a0\u00a0 \u00a0virtual void SoloKeyPressed(const KeyEvent &amp;arg) = 0;\r\n\u00a0\u00a0 \u00a0virtual void SoloKeyReleased(const KeyEvent &amp;arg) = 0;\r\n};\r\n\r\nclass InputManager : public Singleton&lt;InputManager&gt;\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0enum Modifier\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SHIFT = 0x0000001,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CTRL\u00a0 = 0x0000010,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ALT\u00a0\u00a0 = 0x0000100\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0InputManager();\r\n\u00a0\u00a0 \u00a0virtual ~InputManager();\r\n\r\n\u00a0\u00a0 \u00a0bool Initialize(HINSTANCE hInstance, HWND hwnd, int iScreenWidth, int iScreenHeight);\r\n\r\n\u00a0\u00a0 \u00a0void Frame();\r\n\r\n\u00a0\u00a0 \u00a0void GetMouseLocation(int&amp; mouseX, int&amp; mouseY);\r\n\r\n\u00a0\u00a0 \u00a0bool IsKeyDown(char key);\r\n\u00a0\u00a0 \u00a0bool IsMouseButtonDown(unsigned int button);\r\n\u00a0\u00a0 \u00a0bool IsModifierDown(Modifier modifier);\r\n\r\n\u00a0\u00a0 \u00a0void SetBuffered(bool bBuffered);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Enregistre le receveur de touches clavier\r\n\u00a0\u00a0 \u00a0void SetKeyListener(KeyListener* pKeyListener);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Renvoie la signification de la cl\u00e9, ex : &quot;F1&quot; pour la touche F1\r\n\u00a0\u00a0 \u00a0std::string GetKeyCodeAsString(char key);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Renvoie la touche correspondante \u00e0 la cl\u00e9\r\n\u00a0\u00a0 \u00a0wchar_t GetKeyCodeAsWChar(char key);\r\n\r\nprivate:\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0bool ReadKeyboard();\r\n\u00a0\u00a0 \u00a0bool ReadMouse();\r\n\u00a0\u00a0 \u00a0void ProcessInput();\r\n\r\n\u00a0\u00a0 \u00a0void UpdateBuffered();\r\n\u00a0\u00a0 \u00a0void UpdateNonBuffered();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0IDirectInput8* m_pDI;\r\n\u00a0\u00a0 \u00a0IDirectInputDevice8* m_pKeyboard;\r\n\u00a0\u00a0 \u00a0IDirectInputDevice8* m_pMouse;\r\n\r\n\u00a0\u00a0 \u00a0unsigned char m_keyboardState[256];\r\n\r\n\u00a0\u00a0 \u00a0DIMOUSESTATE m_mouseState;\r\n\r\n\u00a0\u00a0 \u00a0int m_iScreenWidth;\r\n\u00a0\u00a0 \u00a0int m_iScreenHeight;\r\n\r\n\u00a0\u00a0 \u00a0int m_iMouseX;\r\n\u00a0\u00a0 \u00a0int m_iMouseY;\r\n\r\n\u00a0\u00a0 \u00a0wchar_t m_deadkey;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bBufferedMode;\r\n\r\n\u00a0\u00a0 \u00a0unsigned int m_iModifiers;\r\n\r\n\u00a0\u00a0 \u00a0std::map&lt;int, bool&gt; m_pressedKeys;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\/* Pourquoi ici un unique objet ?\r\n\u00a0\u00a0 \u00a0Car on a besoin que d'un seul KeyListener car\r\n\u00a0\u00a0 \u00a0c'est soit la console, soit la messagerie qui ont besoin des entr\u00e9es clavier\r\n\u00a0\u00a0 \u00a0\u00e0 la fois *\/\r\n\u00a0\u00a0 \u00a0KeyListener* m_pKeyListener;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Variables con\u00e7ues pour que l'appel \u00e0 la callback KeyListener soit appel\u00e9e moins de fois dans le temps\r\n\u00a0\u00a0 \u00a0unsigned long m_iElapsedTime;\r\n\u00a0\u00a0 \u00a0unsigned long m_iLastTime;\r\n\u00a0\u00a0 \u00a0unsigned int m_iWaitTime;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Variables con\u00e7ues pour la touche appuy\u00e9e soit rep\u00e9t\u00e9e quand on reste longtemps appuy\u00e9e dessus\r\n\u00a0\u00a0 \u00a0unsigned long m_iElapsedTime2;\r\n\u00a0\u00a0 \u00a0unsigned long m_iLastTime2;\r\n\u00a0\u00a0 \u00a0unsigned int m_iWaitTime2;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bCanRepeatKey;\r\n\u00a0\u00a0 \u00a0unsigned int m_iCurrentKeyCode;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier InputManager.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#include &quot;Console.h&quot;\r\n#include &quot;InputManager.h&quot;\r\n\r\n#include &lt;sstream&gt;\r\n#include &lt;DxErr.h&gt;\r\n\r\ntemplate&lt;&gt; InputManager* Singleton&lt;InputManager&gt;::ms_instance = nullptr;\r\n\r\nInputManager::InputManager() :\r\nm_pDI(nullptr),\r\nm_pKeyboard(nullptr),\r\nm_pMouse(nullptr),\r\nm_iMouseX(0),\r\nm_iMouseY(0),\r\nm_deadkey('&#92;&#48;'),\r\nm_bBufferedMode(false),\r\nm_iModifiers(0),\r\nm_pKeyListener(nullptr),\r\nm_bCanRepeatKey(false),\r\nm_iWaitTime(INPUT_MANAGER_REPETITIVE_WAIT_TIME),\r\nm_iLastTime(0),\r\nm_iElapsedTime(0),\r\nm_iWaitTime2(INPUT_MANAGER_REPETITIVE_WAIT_TIME_2),\r\nm_iLastTime2(0),\r\nm_iElapsedTime2(0),\r\nm_iCurrentKeyCode(0)\r\n{\r\n\u00a0\u00a0\u00a0 SetBuffered(true);\r\n}\r\n\r\nInputManager::~InputManager()\r\n{\r\n\u00a0\u00a0\u00a0 if (m_pMouse)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pMouse-&gt;Unacquire();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SAFE_RELEASE(m_pMouse);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if (m_pKeyboard)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyboard-&gt;Unacquire();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SAFE_RELEASE(m_pKeyboard);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if (m_pDI)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SAFE_RELEASE(m_pDI);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n\r\nbool InputManager::Initialize(HINSTANCE hInstance, HWND hwnd, int iScreenWidth, int iScreenHeight)\r\n{\r\n\u00a0\u00a0\u00a0 HRESULT hr;\r\n\r\n\u00a0\u00a0\u00a0 m_iScreenWidth = iScreenWidth;\r\n\u00a0\u00a0\u00a0 m_iScreenHeight = iScreenHeight;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 \/****** Setup du clavier ******\/\r\n\u00a0\u00a0\u00a0 hr= DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&amp;m_pDI, nullptr);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pDI-&gt;CreateDevice(GUID_SysKeyboard, &amp;m_pKeyboard, nullptr);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pKeyboard-&gt;SetDataFormat(&amp;c_dfDIKeyboard);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pKeyboard-&gt;SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/***********\/\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 \/\/ On configure la taille du buffer qui sert \u00e0 sauvegarder l'\u00e9tat\r\n\u00a0\u00a0\u00a0 \/\/ des touches du clavier entr\u00e9es\r\n\u00a0\u00a0\u00a0 DIPROPDWORD dipdw;\r\n\u00a0\u00a0\u00a0 dipdw.diph.dwSize\u00a0 = sizeof(DIPROPDWORD);\r\n\u00a0\u00a0\u00a0 dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);\r\n\u00a0\u00a0\u00a0 dipdw.diph.dwObj = 0;\r\n\u00a0\u00a0\u00a0 dipdw.diph.dwHow = DIPH_DEVICE;\r\n\u00a0\u00a0\u00a0 dipdw.dwData = INPUT_MANAGER_BUFFER_SIZE;\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pKeyboard-&gt;SetProperty(DIPROP_BUFFERSIZE, &amp;dipdw.diph);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/***********\/\r\n\u00a0\u00a0\u00a0 hr = m_pKeyboard-&gt;Acquire();\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/****** Setup de la souris ******\/\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pDI-&gt;CreateDevice(GUID_SysMouse, &amp;m_pMouse, nullptr);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pMouse-&gt;SetDataFormat(&amp;c_dfDIMouse);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pMouse-&gt;SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pMouse-&gt;Acquire();\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 return true;\r\n}\r\n\r\nvoid InputManager::SetKeyListener(KeyListener* pKeyListener)\r\n{\r\n\u00a0\u00a0\u00a0 assert(pKeyListener);\r\n\r\n\u00a0\u00a0\u00a0 m_pKeyListener = pKeyListener;\r\n}\r\n\r\nbool InputManager::IsModifierDown(Modifier modifier)\r\n{\r\n\u00a0\u00a0\u00a0 return m_iModifiers &amp; MKF_MODIFIERS;\r\n}\r\n\r\nvoid InputManager::Frame()\r\n{\r\n\u00a0\u00a0\u00a0 ReadKeyboard();\r\n\r\n\u00a0\u00a0\u00a0 ReadMouse();\r\n\r\n\u00a0\u00a0\u00a0 ProcessInput();\r\n}\r\n\r\nvoid InputManager::GetMouseLocation(int&amp; mouseX, int&amp; mouseY)\r\n{\r\n\u00a0\u00a0\u00a0 mouseX = m_iMouseX;\r\n\u00a0\u00a0\u00a0 mouseY = m_iMouseY;\r\n}\r\n\r\nbool InputManager::ReadKeyboard()\r\n{\r\n\u00a0\u00a0\u00a0 if (m_bBufferedMode)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UpdateBuffered();\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UpdateNonBuffered();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 return true;\r\n}\r\n\r\n\/* setcapture &amp; getcapture (essayer) *\/\r\nvoid InputManager::UpdateBuffered()\r\n{\r\n\u00a0\u00a0\u00a0 DIDEVICEOBJECTDATA diBuff[INPUT_MANAGER_BUFFER_SIZE];\r\n\u00a0\u00a0\u00a0 DWORD entries = INPUT_MANAGER_BUFFER_SIZE;\r\n\r\n\u00a0\u00a0\u00a0 HRESULT hr;\r\n\u00a0\u00a0\u00a0 hr = m_pKeyboard-&gt;GetDeviceData(sizeof(DIDEVICEOBJECTDATA), diBuff, &amp;entries, 0);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ZeroMemory(m_keyboardState, sizeof(m_keyboardState));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyboard-&gt;Acquire();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Pour la touche soit rep\u00e9t\u00e9e quand on reste longtemps appuy\u00e9e dessus\r\n\u00a0\u00a0\u00a0 if (m_iCurrentKeyCode != 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iElapsedTime2 = GetTickCount() - m_iLastTime2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_iElapsedTime2 &gt; m_iWaitTime2)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_bCanRepeatKey = true; \r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iLastTime2 = GetTickCount();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ On reset le timer au-dessus\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iLastTime2 = GetTickCount();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if (!SYSTEM-&gt;HasFocus())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bCanRepeatKey = false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iElapsedTime2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iCurrentKeyCode = 0;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 \/\/ On parcourt les touches appuy\u00e9es\r\n\u00a0\u00a0\u00a0 for (unsigned int i = 0; i &lt; entries; i++)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int iKeyCode = diBuff[i].dwOfs;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (diBuff[i].dwData &amp; 0x80)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pressedKeys[iKeyCode] = true;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iCurrentKeyCode = diBuff[i].dwData;\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (iKeyCode == DIK_LCONTROL || iKeyCode == DIK_RCONTROL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iModifiers |= CTRL;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (iKeyCode == DIK_LSHIFT || iKeyCode == DIK_RSHIFT)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iModifiers |= SHIFT;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (iKeyCode == DIK_LMENU || iKeyCode == DIK_RMENU)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iModifiers |= ALT;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_pKeyListener)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyListener-&gt;SoloKeyPressed( KeyEvent(iKeyCode, GetKeyCodeAsWChar(iKeyCode)) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pressedKeys[iKeyCode] = false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_bCanRepeatKey = false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iCurrentKeyCode = 0;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (iKeyCode == DIK_LCONTROL || iKeyCode == DIK_RCONTROL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iModifiers &amp;= ~CTRL;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (iKeyCode == DIK_LSHIFT || iKeyCode == DIK_RSHIFT)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iModifiers &amp;= ~SHIFT;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (iKeyCode == DIK_LMENU || iKeyCode == DIK_RMENU)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iModifiers &amp;= ~ALT;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_pKeyListener)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyListener-&gt;SoloKeyReleased( KeyEvent(iKeyCode, GetKeyCodeAsWChar(iKeyCode)) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/********** Entr\u00e9es r\u00e9p\u00e9t\u00e9es ***********\/\r\n\r\n\u00a0\u00a0\u00a0 \/\/ On cherche quelle touche du clavier a \u00e9t\u00e9 appuy\u00e9e\r\n\u00a0\u00a0\u00a0 int iKeyCode = 0;\r\n\u00a0\u00a0\u00a0 for (auto it = m_pressedKeys.begin(); it != m_pressedKeys.end(); it++)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool bPressed = it-&gt;second;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (bPressed)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iKeyCode = it-&gt;first;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if (m_pKeyListener &amp;&amp; iKeyCode != 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iElapsedTime = GetTickCount() - m_iLastTime;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ On appel la callback a une certaine fr\u00e9quence de temps\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_iElapsedTime &gt; m_iWaitTime)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyListener-&gt;RepetitiveKeyPressed( KeyEvent(iKeyCode, GetKeyCodeAsWChar(iKeyCode)) );\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_bCanRepeatKey)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyListener-&gt;SoloKeyPressed( KeyEvent(iKeyCode, GetKeyCodeAsWChar(iKeyCode)) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iLastTime = GetTickCount();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nvoid InputManager::UpdateNonBuffered()\r\n{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 HRESULT hr;\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pKeyboard-&gt;GetDeviceState(sizeof(m_keyboardState), (LPVOID)&amp;m_keyboardState);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ZeroMemory(m_keyboardState, sizeof(m_keyboardState));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pKeyboard-&gt;Acquire();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nbool InputManager::ReadMouse()\r\n{\r\n\u00a0\u00a0\u00a0 HRESULT hr;\r\n\r\n\u00a0\u00a0\u00a0 hr = m_pMouse-&gt;GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&amp;m_mouseState);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pMouse-&gt;Acquire();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 return true;\r\n}\r\n\r\nvoid InputManager::ProcessInput()\r\n{\r\n\u00a0\u00a0\u00a0 m_iMouseX += m_mouseState.lX;\r\n\u00a0\u00a0\u00a0 m_iMouseY += m_mouseState.lY;\r\n\r\n\u00a0\u00a0\u00a0 if (m_iMouseX &lt; 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iMouseX = 0;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if (m_iMouseY &lt; 0) \u00a0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iMouseY = 0;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 if (m_iMouseX &gt; m_iScreenWidth) \u00a0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iMouseX = m_iScreenWidth;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if (m_iMouseY &gt; m_iScreenHeight)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iMouseY = m_iScreenHeight;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 return;\r\n}\r\n\r\nbool InputManager::IsKeyDown(char key)\r\n{\r\n\u00a0\u00a0\u00a0 return KEYDOWN(m_keyboardState, key);\r\n}\r\n\r\nbool InputManager::IsMouseButtonDown(unsigned int button)\r\n{\r\n\u00a0\u00a0\u00a0 return (m_mouseState.rgbButtons[button] &amp; 0x80) != 0;\r\n}\r\n\r\nstd::string InputManager::GetKeyCodeAsString(char key)\r\n{\r\n\u00a0\u00a0\u00a0 std::string sKeyCode;\r\n\r\n\u00a0\u00a0\u00a0 char temp[256];\r\n\r\n\u00a0\u00a0\u00a0 DIPROPSTRING prop;\r\n\u00a0\u00a0\u00a0 prop.diph.dwSize = sizeof(DIPROPSTRING);\r\n\u00a0\u00a0\u00a0 prop.diph.dwHeaderSize = sizeof(DIPROPHEADER);\r\n\u00a0\u00a0\u00a0 prop.diph.dwObj = static_cast&lt;DWORD&gt;(key);\r\n\u00a0\u00a0\u00a0 prop.diph.dwHow = DIPH_BYOFFSET;\r\n\r\n\u00a0\u00a0\u00a0 if (SUCCEEDED(m_pKeyboard-&gt;GetProperty(DIPROP_KEYNAME, &amp;prop.diph)))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (WideCharToMultiByte(CP_ACP, 0, prop.wsz, -1, temp, sizeof(temp), nullptr, nullptr))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return sKeyCode.assign(temp);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 std::stringstream ss;\r\n\u00a0\u00a0\u00a0 ss &lt;&lt; &quot;Key_&quot; &lt;&lt; (int) key;\r\n\r\n\u00a0\u00a0\u00a0 return sKeyCode.assign(ss.str());\r\n}\r\n\r\nwchar_t InputManager::GetKeyCodeAsWChar(char key)\r\n{\r\n\u00a0\u00a0\u00a0 BYTE keyState[256];\r\n\u00a0\u00a0\u00a0 HKL layout = GetKeyboardLayout(0);\r\n\r\n\u00a0\u00a0\u00a0 if (GetKeyboardState(keyState) == 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 unsigned int vk = MapVirtualKeyEx(key, 3, layout);\r\n\u00a0\u00a0\u00a0 if (vk == 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 WCHAR buff[3] = {0};\r\n\u00a0\u00a0\u00a0 int ascii = ToUnicodeEx(vk, key, keyState, buff, 3, 0, layout);\r\n\r\n\u00a0\u00a0\u00a0 if(ascii == 1 &amp;&amp; m_deadkey != '&#92;&#48;' )\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WCHAR wcBuff[3] = {buff[0], m_deadkey, '&#92;&#48;'};\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WCHAR out[3];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = '&#92;&#48;';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (FoldStringW(MAP_PRECOMPOSED, (LPWSTR)wcBuff, 3, (LPWSTR)out, 3))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return out[0];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else if (ascii == 1)\r\n\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = '&#92;&#48;';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return buff[0];\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else if (ascii == 2)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch (buff[0])\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 0x5E: \/\/ Circumflex accent: \u00e2\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = 0x302;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 0x60: \/\/ Grave accent: \u00e0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = 0x300;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 0xA8: \/\/ Diaeresis: \u00fc\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = 0x308;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 0xB4: \/\/ Acute accent: \u00e9\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = 0x301;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 0xB8: \/\/ Cedilla: \u00e7\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = 0x327;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_deadkey = buff[0];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 return 0;\r\n}\r\n\r\nvoid InputManager::SetBuffered(bool bBuffered)\r\n{\r\n\u00a0\u00a0\u00a0 m_bBufferedMode = bBuffered;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Avec l&rsquo;interface DirectInput, on peut \u00e9laborer un syst\u00e8me d&rsquo;entr\u00e9e clavier souris tout simple.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Intro : DirectInput est un composant de DirectX qui permet de g\u00e9rer les entr\u00e9es clavier (touches) et de la souris (position). Bien qu\u2019il soit tendance \u00e0 n\u2019\u00eatre plus utilis\u00e9, il est toujours utile car il permet de capturer directement les entr\u00e9es clavier \u00e0 partir des drivers p\u00e9riph\u00e9riques correspondants. Pr\u00e9requis : &#8211; Savoir un peu [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3065"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3065"}],"version-history":[{"count":16,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3065\/revisions"}],"predecessor-version":[{"id":3258,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3065\/revisions\/3258"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}