{"id":3063,"date":"2015-06-24T08:03:29","date_gmt":"2015-06-24T08:03:29","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3063"},"modified":"2015-11-25T09:08:23","modified_gmt":"2015-11-25T09:08:23","slug":"entrees-clavier-et-souris-avec-la-boucle-de-message-wndproc","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3063","title":{"rendered":"Entr\u00e9es clavier et souris avec la boucle de message WndProc"},"content":{"rendered":"<div class=\"entry-content\">\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/keyboard.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3069\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/keyboard.jpg\" alt=\"keyboard\" width=\"356\" height=\"218\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/keyboard.jpg 1400w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/keyboard-300x184.jpg 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/keyboard-1024x628.jpg 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/keyboard-624x382.jpg 624w\" sizes=\"(max-width: 356px) 100vw, 356px\" \/><\/a><\/p>\n<p>todo : remplacer les scancodes par les virtual codes<\/p>\n<p><strong>Intro : <\/strong><\/p>\n<p>A l&rsquo;inverse de l&rsquo;utilisation du composant DirectInput de DirectX, nous pouvons directement utiliser les r\u00e9ponses de la <strong>boucle de message WndProc<\/strong> en tant qu&rsquo;entr\u00e9es clavier-souris.<\/p>\n<p>Cet article fournira la classe <strong>InputManager<\/strong> utilis\u00e9e dans d&rsquo;autres articles.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le code pour 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#include &lt;windows.h&gt;\r\n#include &lt;map&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;sstream&gt;\r\n#include &lt;iostream&gt;\r\n\r\n#define BIT(x) 1 &lt;&lt; x\r\n\r\n#include &quot;Singleton.h&quot;\r\n\r\n\/\/ Objet d'entr\u00e9e clavier qui sera envoy\u00e9 au KeyListener enregistr\u00e9\r\n\/\/ dans la classe InputManager\r\nclass KeyEvent\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0KeyEvent(int kc, wchar_t txt) : keyCode(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 keyCode;\r\n\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\n\/\/ Classe KeyListener qui permet \u00e0 n'importe quel objet h\u00e9ritant de\r\n\/\/ cette classe de recevoir les entr\u00e9es clavier\r\nclass KeyListener\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0virtual ~KeyListener() {}\r\n\r\n\u00a0\u00a0 \u00a0virtual void OnKeyPressed(const KeyEvent &amp;arg) = 0;\r\n\u00a0\u00a0 \u00a0virtual void OnKeyReleased(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 \u00a0\/\/ Touches sp\u00e9ciales\r\n\u00a0\u00a0 \u00a0enum KeyModifier\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SHIFT = BIT(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CTRL\u00a0 = BIT(1),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ALT\u00a0\u00a0 = BIT(2)\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Bouttons de la souris\r\n\u00a0\u00a0 \u00a0enum MouseButton\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MouseButtonLeft,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MouseButtonRight,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MouseButtonMiddle,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MouseButtoNone\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0InputManager();\r\n\u00a0\u00a0 \u00a0virtual ~InputManager();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ M\u00e9thodes d'enregistrements des entr\u00e9es clavier de la boucle\r\n\u00a0\u00a0 \u00a0\/\/ de message Win32 WndProc\r\n\u00a0\u00a0 \u00a0void InjectKeyDown(unsigned int iVirtualKeyCode, unsigned int iScanCode);\r\n\u00a0\u00a0 \u00a0void InjectKeyUp(unsigned int iVirtualKeyCode, unsigned int iScanCode);\r\n\u00a0\u00a0 \u00a0void InjectKeyModifierDown(KeyModifier modifier);\r\n\u00a0\u00a0 \u00a0void InjectKeyModifierUp(KeyModifier modifier);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ M\u00e9thodes d'enregistrements des entr\u00e9es souris de la boucle\r\n\u00a0\u00a0 \u00a0\/\/ de message Win32 WndProc\r\n\u00a0\u00a0 \u00a0void InjectMousePosition(int iMouseX, int iMouseY);\r\n\u00a0\u00a0 \u00a0void InjectMouseButtonDown(MouseButton button);\r\n\u00a0\u00a0 \u00a0void InjectMouseButtonUp();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ M\u00e9thodes de r\u00e9cup\u00e9rations de la position de la souris\r\n\u00a0\u00a0 \u00a0void GetMouseAbsoluteLocation(int&amp; iMouseX, int&amp; iMouseY);\r\n\u00a0\u00a0 \u00a0void GetMouseRelativePosition(float&amp; fX, float&amp; fY);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ M\u00e9thodes de r\u00e9cup\u00e9rations des entr\u00e9es clavier\r\n\u00a0\u00a0 \u00a0bool IsKeyDown(unsigned int key);\r\n\u00a0\u00a0 \u00a0bool IsKeyUp(unsigned int key);\r\n\u00a0\u00a0 \u00a0bool IsMouseButtonDown(unsigned int button);\r\n\u00a0\u00a0 \u00a0bool IsKeyModifierDown(KeyModifier modifier);\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 le caract\u00e8re wchar_t correspondant \u00e0 la cl\u00e9 sp\u00e9cifi\u00e9\r\n\u00a0\u00a0 \u00a0wchar_t GetKeyCodeAsWChar(char key);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Renvoie une cha\u00eene de caract\u00e8re correspondant \u00e0 la cl\u00e9 sp\u00e9cifi\u00e9\r\n\u00a0\u00a0 \u00a0std::string GetKeyCodeAsString(char key);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Met le curseur au centre de la fen\u00eatre\r\n\u00a0\u00a0 \u00a0void CenterMouseCursor();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Je place cette fonction utilitaire au sein m\u00eame\r\n\u00a0\u00a0 \u00a0\/\/ de la classe, mais sa place serait plus juste ailleurs\r\n\u00a0\u00a0 \u00a0std::string Formater(const std::wstring&amp; src)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0char outString[512];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CharToOemW(src.c_str(), outString);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return std::string(outString);\r\n\u00a0\u00a0\u00a0 }\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0\/\/ Coordonn\u00e9es de la souris\r\n\u00a0\u00a0 \u00a0int m_iMouseX;\r\n\u00a0\u00a0 \u00a0int m_iMouseY;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Variable repr\u00e9sentant les combinaison de touches\r\n\u00a0\u00a0 \u00a0\/\/ de modification\r\n\u00a0\u00a0 \u00a0unsigned int m_iModifiers;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Touches pr\u00e9ss\u00e9es\r\n\u00a0\u00a0 \u00a0std::map&lt;unsigned int, bool&gt; m_pressedKeys;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\/\/ L'\u00e9couteur d'entr\u00e9e clavier\r\n\u00a0\u00a0 \u00a0KeyListener* m_pKeyListener;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Le boutton de la souris^^\r\n\u00a0\u00a0 \u00a0MouseButton m_iMouseButton;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ variable ppour g\u00e9rer les accents comme :\r\n\u00a0\u00a0 \u00a0\/\/ \u00fb, \u00ec, \u00f2, \u00f4, etc...\r\n\u00a0\u00a0 \u00a0wchar_t m_deadKey;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le code pour le fichier InputManager.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;InputManager.h&quot;\r\n#include &quot;System.h&quot;\r\n\r\n#include &lt;sstream&gt;\r\n\r\ntemplate&lt;&gt; InputManager* Singleton&lt;InputManager&gt;::ms_instance = nullptr;\r\n\r\nInputManager::InputManager() :\r\nm_iMouseX(0),\r\nm_iMouseY(0),\r\nm_iModifiers(0),\r\nm_pKeyListener(nullptr),\r\nm_iMouseButton(MouseButton::MouseButtoNone),\r\nm_deadKey('&#92;&#48;')\r\n{\r\n}\r\n\r\nInputManager::~InputManager()\r\n{\r\n}\r\n\r\nvoid InputManager::SetKeyListener(KeyListener* pKeyListener)\r\n{\r\n\u00a0\u00a0 \u00a0assert(pKeyListener);\r\n\r\n\u00a0\u00a0 \u00a0m_pKeyListener = pKeyListener;\r\n}\r\n\r\nbool InputManager::IsKeyModifierDown(KeyModifier modifier)\r\n{\r\n\u00a0\u00a0 \u00a0return m_iModifiers &amp; modifier;\r\n}\r\n\r\nvoid InputManager::InjectKeyModifierDown(KeyModifier modifier)\r\n{\r\n\u00a0\u00a0 \u00a0m_iModifiers |= modifier;\r\n}\r\n\r\nvoid InputManager::InjectKeyModifierUp(KeyModifier modifier)\r\n{\r\n\u00a0\u00a0 \u00a0m_iModifiers &amp;= ~(modifier);\r\n}\r\n\r\nvoid InputManager::InjectKeyDown(unsigned int iVirtualKeyCode, unsigned int iScanCode)\r\n{\r\n\u00a0\u00a0 \u00a0m_pressedKeys[iVirtualKeyCode] = true;\r\n\r\n\u00a0\u00a0 \u00a0if (m_pKeyListener != nullptr)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0wchar_t c = GetKeyCodeAsWChar(iScanCode);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0KeyEvent keyEvent(iScanCode, c);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pKeyListener-&gt;OnKeyPressed(keyEvent);\r\n\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid InputManager::InjectKeyUp(unsigned int iVirtualKeyCode, unsigned int iScanCode)\r\n{\r\n\u00a0\u00a0 \u00a0m_pressedKeys[iVirtualKeyCode] = false;\r\n\r\n\u00a0\u00a0 \u00a0if (m_pKeyListener != nullptr)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0wchar_t c = GetKeyCodeAsWChar(iScanCode);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0KeyEvent keyEvent(iScanCode, c);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pKeyListener-&gt;OnKeyReleased(keyEvent);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid InputManager::InjectMousePosition(int iMouseX, int iMouseY)\r\n{\r\n\u00a0\u00a0 \u00a0m_iMouseX = iMouseX;\r\n\u00a0\u00a0 \u00a0m_iMouseY = iMouseY;\r\n}\r\n\r\nvoid InputManager::GetMouseAbsoluteLocation(int&amp; mouseX, int&amp; mouseY)\r\n{\r\n\u00a0\u00a0 \u00a0mouseX = m_iMouseX;\r\n\u00a0\u00a0 \u00a0mouseY = m_iMouseY;\r\n}\r\n\r\n\/\/ todo : essayer avec les m_iMouseX et m_iMouseY\r\nvoid InputManager::GetMouseRelativePosition(float&amp; fX, float&amp; fY)\r\n{\r\n\u00a0\u00a0 \u00a0POINT p;\r\n\u00a0\u00a0 \u00a0if (!GetCursorPos(&amp;p))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DWORD xy = GetMessagePos();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p.x = LOWORD(xy);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p.y = HIWORD(xy);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0int borderX = GetSystemMetrics(SM_CXSIZEFRAME);\r\n\u00a0\u00a0 \u00a0int borderY = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME);\r\n\r\n\u00a0\u00a0 \u00a0RECT rect;\r\n\u00a0\u00a0 \u00a0GetWindowRect(SYSTEM-&gt;GetHwnd(), &amp;rect);\r\n\r\n\u00a0\u00a0 \u00a0float x = p.x - rect.left - borderX;\r\n\u00a0\u00a0 \u00a0float y = p.y - rect.top - borderY;\r\n\r\n\u00a0\u00a0 \u00a0fX = ((float) x \/ (float) SYSTEM-&gt;GetWindowWidth()) - 0.5f;\r\n\u00a0\u00a0 \u00a0fY = ((float) y \/ (float) SYSTEM-&gt;GetWindowHeight()) - 0.5f;\r\n}\r\n\r\nbool InputManager::IsKeyDown(unsigned int key)\r\n{\r\n\u00a0\u00a0 \u00a0return m_pressedKeys[key] == true;\r\n}\r\n\r\nbool InputManager::IsKeyUp(unsigned int key)\r\n{\r\n\u00a0\u00a0 \u00a0return m_pressedKeys[key] == false;\r\n}\r\n\r\nvoid InputManager::InjectMouseButtonDown(MouseButton button)\r\n{\r\n\u00a0\u00a0 \u00a0m_iMouseButton = button;\r\n}\r\n\r\nvoid InputManager::InjectMouseButtonUp()\r\n{\r\n\u00a0\u00a0 \u00a0m_iMouseButton = MouseButtoNone;\r\n}\r\n\r\nbool InputManager::IsMouseButtonDown(unsigned int button)\r\n{\r\n\u00a0\u00a0 \u00a0return m_iMouseButton == button;\r\n}\r\n\r\nstd::string InputManager::GetKeyCodeAsString(char key)\r\n{\r\n\u00a0\u00a0 \u00a0wchar_t w = GetKeyCodeAsWChar(key);\r\n\r\n\u00a0\u00a0 \u00a0std::wstring wStr;\r\n\u00a0\u00a0 \u00a0wStr.push_back( w );\r\n\r\n\u00a0\u00a0 \u00a0std::string str = Formater(wStr);\r\n\r\n\u00a0\u00a0 \u00a0return str;\r\n}\r\n\r\nwchar_t InputManager::GetKeyCodeAsWChar(char key)\r\n{\r\n\u00a0\u00a0 \u00a0BYTE keyState[256];\r\n\u00a0\u00a0 \u00a0HKL layout = GetKeyboardLayout(0);\r\n\r\n\u00a0\u00a0 \u00a0if (GetKeyboardState(keyState) == 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 0;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0unsigned int vk = MapVirtualKeyEx(key, 3, layout);\r\n\r\n\u00a0\u00a0 \u00a0if (vk == 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 0;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0WCHAR buff[3] = {0};\r\n\u00a0\u00a0 \u00a0int ascii = ToUnicodeEx(vk, key, keyState, buff, 3, 0, layout);\r\n\r\n\u00a0\u00a0 \u00a0if (ascii == 1 &amp;&amp; m_deadKey != '&#92;&#48;')\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0WCHAR wcBuff[3] = {buff[0], m_deadKey, '&#92;&#48;'};\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0WCHAR out[3];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (FoldStringW(MAP_PRECOMPOSED, (LPWSTR)wcBuff, 3, (LPWSTR)out, 3))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return out[0];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (ascii == -1)\r\n\u00a0\u00a0 \u00a0{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return buff[0];\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (ascii == 2)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0switch (buff[0])\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case 0x5E: \/\/ Circumflex accent: \u00e2\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = 0x302;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case 0x60: \/\/ Grave accent: \u00e0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = 0x300;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case 0xA8: \/\/ Diaeresis: \u00fc\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = 0x308;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case 0xB4: \/\/ Acute accent: \u00e9\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = 0x301;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case 0xB8: \/\/ Cedilla: \u00e7\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = 0x327;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0default:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = buff[0];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0}\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0else if (ascii == 1)\r\n\u00a0\u00a0 \u00a0{\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_deadKey = '&#92;&#48;';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return buff[0];\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return 0;\r\n}\r\n\r\nvoid InputManager::CenterMouseCursor()\r\n{\r\n\u00a0\u00a0 \u00a0int borderX = GetSystemMetrics(SM_CXSIZEFRAME);\r\n\u00a0\u00a0 \u00a0int borderY = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME);\r\n\r\n\u00a0\u00a0 \u00a0RECT rect;\r\n\u00a0\u00a0 \u00a0HWND hwnd = SYSTEM-&gt;GetHwnd();\r\n\r\n\u00a0\u00a0 \u00a0GetWindowRect(hwnd, &amp;rect);\r\n\r\n\u00a0\u00a0 \u00a0unsigned int iWindowWidth = SYSTEM-&gt;GetWindowWidth();\r\n\u00a0\u00a0 \u00a0unsigned int iWindowHeight = SYSTEM-&gt;GetWindowHeight();\r\n\r\n\u00a0\u00a0 \u00a0SetCursorPos(0.5f * iWindowWidth + rect.left + borderX, 0.5f * iWindowHeight + rect.top + borderY);\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici la fonction WndProc utilis\u00e9e pour obtenir les entr\u00e9es afin de les passer \u00e0 la classe InputManager :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r\n{\r\n\u00a0\u00a0 \u00a0if (!InputManager::IsCreated())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return DefWindowProc(hWnd, message, wParam, lParam);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 switch (message)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case WM_DESTROY:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PostQuitMessage(0);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_KEYDOWN:\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyDown(wParam, HIWORD(lParam));\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (wParam == VK_SHIFT)\r\n\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 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyModifierDown(InputManager::KeyModifier::SHIFT);\r\n\u00a0\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 \u00a0if (wParam == VK_CONTROL)\r\n\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 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyModifierDown(InputManager::KeyModifier::CTRL);\r\n\u00a0\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 \u00a0if (wParam == VK_MENU)\r\n\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 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyModifierDown(InputManager::KeyModifier::ALT);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_KEYUP:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyUp(wParam, HIWORD(lParam));\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (wParam == VK_SHIFT)\r\n\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 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyModifierUp(InputManager::KeyModifier::SHIFT);\r\n\u00a0\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 \u00a0if (wParam == VK_CONTROL)\r\n\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 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyModifierUp(InputManager::KeyModifier::CTRL);\r\n\u00a0\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 \u00a0if (wParam == VK_MENU)\r\n\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 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectKeyModifierUp(InputManager::KeyModifier::ALT);\r\n\u00a0\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 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_MOUSEMOVE:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int iMouseX = (int) LOWORD(lParam);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int iMouseY = (int) HIWORD(lParam);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectMousePosition(iMouseX, iMouseY);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_LBUTTONDOWN:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectMouseButtonDown(InputManager::MouseButton::MouseButtonLeft);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_RBUTTONDOWN:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectMouseButtonDown(InputManager::MouseButton::MouseButtonRight);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_MBUTTONDOWN:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectMouseButtonDown(InputManager::MouseButton::MouseButtonMiddle);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_MBUTTONUP:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_LBUTTONUP:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case WM_RBUTTONUP:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;InjectMouseButtonUp();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\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\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return DefWindowProc(hWnd, message, wParam, lParam);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\r\n\u00a0\u00a0\u00a0 return 0;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Nous avons pr\u00e9senter une mani\u00e8re de r\u00e9cup\u00e9rer les entr\u00e9es clavier de votre jeu ou application.<\/p>\n<p>Voici<strong> l\u2019archive<\/strong> du code complet pour cet <a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/data\/RawInputManager.zip\">RawInputManager.zip<\/a><\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>todo : remplacer les scancodes par les virtual codes Intro : A l&rsquo;inverse de l&rsquo;utilisation du composant DirectInput de DirectX, nous pouvons directement utiliser les r\u00e9ponses de la boucle de message WndProc en tant qu&rsquo;entr\u00e9es clavier-souris. Cet article fournira la classe InputManager utilis\u00e9e dans d&rsquo;autres articles. Explications : Voici le code pour le fichier InputManager.h [&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\/3063"}],"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=3063"}],"version-history":[{"count":11,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3063\/revisions"}],"predecessor-version":[{"id":3997,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3063\/revisions\/3997"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}