示例#1
0
DWORD WINAPI RawThread(HANDLE hCloseEvent)
{
    HWND hDummy;
    UINT cbSize;
    MSG msg;

    hDummy = CreateWindowEx(0, L"button", 0, 0, 0, 0, 1, 1, 0, 0, g_hInstance, 0);

    RAWINPUTDEVICE Rid[2] ;

    Rid[0].usUsagePage = 0x01; 
    Rid[0].usUsage     = 0x02; // mouse
    Rid[0].dwFlags     = 0; 
    Rid[0].hwndTarget  = hDummy;

    Rid[1].usUsagePage = 0x01 ;
    Rid[1].usUsage     = 0x06 ; // keyboard
    Rid[1].dwFlags     = 0 ;     
    Rid[1].hwndTarget  = hDummy ;

    if( !RegisterRawInputDevices(Rid, 2, sizeof(Rid[0]) ) )
        assert(false);


    while(1)
    {
        DWORD result = MsgWaitForMultipleObjects(1, &hCloseEvent, 0, INFINITE, QS_RAWINPUT);

        if(result == WAIT_OBJECT_0 + 1)
        {
            RAWINPUT *pri;

            if(GetRawInputBuffer(0, &cbSize, sizeof(RAWINPUTHEADER)))
                break;

            cbSize *= 16;

            if(!(pri = (RAWINPUT*) malloc(cbSize)))
                break;

            while(1)
            {
                DWORD cri = GetRawInputBuffer(pri, &cbSize, sizeof(RAWINPUTHEADER));

                if(cri && cri != -1)
                {
                    RAWINPUT *p = pri;

                    for(; cri; cri--, p = NEXTRAWINPUTBLOCK(p))
                    { 
                        InputPacket inputPacket;

                        if(p->header.dwType == RIM_TYPEKEYBOARD)
                        {
                            inputPacket.type              = 0;
                            inputPacket.keyboard.key      = ( (RAWINPUT*)(& ( (BYTE*) p)[8]) )->data.keyboard.VKey;
                            inputPacket.keyboard.keyFlags = ( (RAWINPUT*)(& ( (BYTE*) p)[8]) )->data.keyboard.Flags;
                        }
                       else if(p->header.dwType ==  RIM_TYPEMOUSE)
                        { 
                            inputPacket.type              = 1;
                            inputPacket.mouse.x           = ( (RAWINPUT*)(& ( (BYTE*) p)[8]) )->data.mouse.lLastX;
                            inputPacket.mouse.y           = ( (RAWINPUT*)(& ( (BYTE*) p)[8]) )->data.mouse.lLastY;
                            inputPacket.mouse.buttonFlags = ( (RAWINPUT*)(& ( (BYTE*) p)[8]) )->data.mouse.usButtonFlags;
                            inputPacket.mouse.wheel       = ( (RAWINPUT*)(& ( (BYTE*) p)[8]) )->data.mouse.usButtonData;
                        }

                        CApp::g_rawInputMsgsQUeue.Push(inputPacket);
                    }
                }
                else
                    break;
            }
            while(PeekMessage(&msg, 0, WM_INPUT, WM_INPUT, PM_REMOVE)){};
            free(pri);
        }
        else
            break;
    }
    DestroyWindow(hDummy);

    return 0;
}
示例#2
0
void wiRawInput::RetrieveBufferedData()
{
	// Some temp global buffer, 1KB is overkill.
	static uint64_t rawBuffer[1024 / 8];
	
	// Then in some function,
	UINT bytes = sizeof(rawBuffer);
	// Loop through reading raw input until no events are left,
	while (1) {
		// Fill up buffer,
		int32_t count = GetRawInputBuffer((PRAWINPUT)rawBuffer, &bytes, sizeof(RAWINPUTHEADER));
		if (count <= 0) return;
		
		// Process all the events, 
		const RAWINPUT* raw = (const RAWINPUT*) rawBuffer;
		while (1) {
			// Process raw event.
			this->raw = *raw;
			// Goto next raw event.
			count--;
			if (count <= 0) break;
			raw = NEXTRAWINPUTBLOCK(raw);
		}
	}

	////while (true){
	//	UINT cbSize;
	//	//Sleep(1000);

	//	GetRawInputBuffer(NULL, &cbSize, sizeof(RAWINPUTHEADER));
	//	cbSize *= 16;            // this is a wild guess
	//	PRAWINPUT pRawInput = (PRAWINPUT)malloc(cbSize);
	//	if (pRawInput == NULL)
	//	{
	//		return;
	//	}
	//	for (;;)
	//	{
	//		UINT cbSizeT = cbSize;
	//		UINT nInput = GetRawInputBuffer(pRawInput, &cbSizeT, sizeof(RAWINPUTHEADER));
	//		if (nInput == 0)
	//		{
	//			break;
	//		}
	//		assert(nInput > 0);
	//		PRAWINPUT* paRawInput = (PRAWINPUT*)malloc(sizeof(PRAWINPUT) * nInput);
	//		if (paRawInput == NULL)
	//		{
	//			break;
	//		}
	//		PRAWINPUT pri = pRawInput;
	//		for (UINT i = 0; i < nInput; ++i)
	//		{
	//			paRawInput[i] = pri;
	//			pri = NEXTRAWINPUTBLOCK(pri);
	//			if (pri->header.dwType == RIM_TYPEHID)
	//			{
	//				int asd=32;
	//				asd = asd;
	//			}
	//		}
	//		// to clean the buffer
	//		DefRawInputProc(paRawInput, nInput, sizeof(RAWINPUTHEADER));

	//		free(paRawInput);
	//	}
	//	free(pRawInput);
	////}
}