Poiché è necessario eseguire un messaggio pump per avere una finestra, si potrebbe anche usare quella pompa per gestire anche l'input della tastiera e del mouse. Dipende interamente dalla tua pompa, se porti gli eventi della tastiera su una finestra secondaria, puoi gestirli nella pompa, se preferisci.
tuo pompa tipico messaggio simile a questo:
while (GetMessage(&msg, NULL, 0, 0))
{
if (WM_QUIT == msg.message)
break;
TranslateMessage(&msg); // post a WM_CHAR message if this is a WM_KEYDOWN
DispatchMessage(&msg); // this sends messages to the msg.hwnd
}
Per un gioco, la pompa potrebbe apparire più simile a questo
while (true)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE | PM_NOYIELD))
{
bool fHandled = false;
if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
fHandled = MyHandleMouseEvent(&msg);
else if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
fHandled = MyHandleKeyEvent(&msg);
else if (WM_QUIT == msg.message)
break;
if (! fHandled)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
// if there are no more messages to handle right now, do some
// game slice processing.
//
}
}
Naturalmente, la pompa effettiva sarà probabilmente ancora più complessa di quello, possibilmente con un MsgWaitForMultipleObjects
così che tu possa svegliarti periodicamente anche se non ci sono messaggi da elaborare, ma immediatamente quando ci sono messaggi.
fonte
2010-01-30 00:56:30
Mi piacerebbe sapere perché non dovrei usare DirectInput. Grazie – Adir
Risposta da Alex in http://stackoverflow.com/questions/2165230/should-i-use-directinput-or-windows-message-loop/2168067#2168067 – bobobobo