Estoy tratando de aprender a manejar la entrada porque estoy trabajando en un motor de gráficos 3D de huesos desnudos, y al intentar aprender la entrada en bruto, me encontré con esta anomalía: crear e inicializar una estructura de Hrawinput, ya que LPARAM causa una llamada anterior a RegisterrawInputDevices a fallar.

#include <iostream>
#include <windows.h>
using namespace std;

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INPUT:
        HRAWINPUT hRawInput = lParam; //this causes the program to print "But it failed!"
//HRAWINPUT hRawInput;
//hRawInput = lParam; //These lines however work fine.
        break;
    case WM_DESTROY:
        PostQuitMessage (0);
        break;
    default:
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}

int WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
    CHAR cname[] = "asdf";
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = cname;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.cbClsExtra = 0;
    RegisterClassEx(&wincl);
    hwnd = CreateWindowEx (0,cname,"invisible raw input window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,544,375,HWND_DESKTOP,NULL,hThisInstance,NULL);
    RAWINPUTDEVICE Rid[1];
    Rid[0].usUsagePage = 0x01;
    Rid[0].usUsage = 0x02;
    Rid[0].dwFlags = RIDEV_INPUTSINK;
    Rid[0].hwndTarget = hwnd;
    if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE)
    cout << "But it failed!";

    while (GetMessage(&messages,0,0,0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}

Compilado con MingW64 versión 8.3.0 y corrió en Windows 7. Esto no tiene sentido, ¿qué está pasando?

Edit1: El RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) 's GetLastError()' s GetLastError() es 0x57, "error_invalid_parameter", pero en x64dbg al ver la llamada puedo ver que siempre es 1, sizeof (librar [0]) siempre = 0x10, e incluso La dirección de referencia de RID es idéntica.

0
fdgklatkljfdsaf 1 jul. 2019 a las 04:09

1 respuesta

La mejor respuesta

Resulta que return 0; en el procedimiento de la ventana debe ser return DefWindowProc(hwnd, message, wParam, lParam);.

Esto es realmente confuso porque el código de ejemplo aquí en MSDN usa return 0;

0
fdgklatkljfdsaf 25 jul. 2019 a las 11:37