LRESULT CALLBACK MainWndProc (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { static HWND hwndButton = 0; HDC hdc; /* A device context used for drawing */ PAINTSTRUCT ps; /* Also used during window drawing */ RECT rc; /* A rectangle used during drawing */ char cBuf[256] = ""; int i; switch (nMsg) { case WM_DESTROY: PostQuitMessage (0); return 0; break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rc); for (i = 0; i < raw_mouse_count(); i++) { wsprintf(cBuf, "Mouse %i X: %ld\nMouse %i Y: %ld\nMouse %i Buttons: %i%i%i\nRelative Mode (lightgun): %i\nVirtual Desktop (Multimonitor): %i", i, get_raw_mouse_x_delta(i), i, get_raw_mouse_y_delta(i), i, is_raw_mouse_button_pressed(i, 0), is_raw_mouse_button_pressed(i, 1), is_raw_mouse_button_pressed(i, 2), is_raw_mouse_absolute(i), is_raw_mouse_virtual_desktop(i)); DrawText(hdc, cBuf, strlen(cBuf), &rc, DT_CENTER); OffsetRect(&rc,0,100); // move the draw position down a bit } EndPaint(hwnd, &ps); return 0; break; case WM_INPUT: { add_to_raw_mouse_x_and_y((HRAWINPUT)lParam); InvalidateRect(hwnd,0,TRUE); SendMessage(hwnd,WM_PAINT,0,0); return 0; } } return DefWindowProc (hwnd, nMsg, wParam, lParam); }
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { static char buff[80+1]; buff[0]=0; mxGetString(prhs[0],buff,80); if (strcmp(buff,"Init") == 0) { //DWORD threadId; if (threadId > 0) { mexPrintf("Init called twice before a Release was called. Trying to release first......\n"); PostThreadMessage(threadId, WM_QUIT, 0, 0); Sleep(1000); } CloseHandle(CreateThread(NULL, 0, Thread, NULL, 0, &threadId)); //const unsigned int dim_array[2] = {1,1}; //plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL); for (int k=0;k< iMAXMICE;k++) HookMiceArray[k] = false; //double *buffer = (double*)mxGetPr(plhs[0]); //*buffer = threadId; return; } if (strcmp(buff,"Hook") == 0) { int iNumHooks = mxGetNumberOfElements(prhs[1]); double *aiHookArray = mxGetPr(prhs[1]); for (int k=0; k < iNumHooks ;k++) HookMiceArray[int(aiHookArray[k])] = true; } if (strcmp(buff,"Unhook") == 0) { int iNumHooks = mxGetNumberOfElements(prhs[1]); double *aiHookArray = mxGetPr(prhs[1]); for (int k=0; k < iNumHooks ;k++) HookMiceArray[int(aiHookArray[k])] = false; } if (strcmp(buff,"Release") == 0) { //DWORD threadId = (DWORD) (*(double*)mxGetPr(prhs[1])); if (threadId > 0) { PostThreadMessage(threadId, WM_QUIT, 0, 0); threadId = 0; } else { mexPrintf("Nothing To Release. Init was not called...\n"); } return; } if (strcmp(buff,"GetMiceName") == 0) { int NumMice = raw_mouse_count(); mwSize Dim[2] = {1,NumMice }; mxArray *mxNames = mxCreateCellArray(2,Dim); for (int k=0;k<NumMice;k++) { char name[5000]; int nSize = get_raw_mouse_name(k, name); mxSetCell(mxNames,k, mxCreateString(name)); } plhs[0] = mxNames; } if (strcmp(buff,"GetNumMice") == 0) { const unsigned int dim_array[2] = {1,1}; plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL); double *buffer = (double*)mxGetPr(plhs[0]); if (threadId == 0) { mexPrintf("Call The Init Function First!\n"); *buffer = -1; } else { *buffer = raw_mouse_count(); } return; } if (strcmp(buff,"GetMouseData") == 0) { int MouseIndex= int(*(double*)mxGetPr(prhs[1])); const unsigned int dim_array[2] = {1,3}; plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL); double *buffer = (double*)mxGetPr(plhs[0]); if (threadId == 0) { mexPrintf("Call The Init Function First!\n"); buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; } else { buffer[0] = get_raw_mouse_x_delta(MouseIndex); buffer[1] = get_raw_mouse_y_delta(MouseIndex); buffer[2] = get_raw_mouse_z_delta(MouseIndex); } return; } if (strcmp(buff,"GetButtons") == 0) { double *MouseIndex= (double*)mxGetPr(prhs[1]); const unsigned int dim_array[2] = {1,3}; plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL); double *buffer = (double*)mxGetPr(plhs[0]); if (threadId == 0) { mexPrintf("Call The Init Function First!\n"); for (int k=0;k<3;k++) { buffer[k] = 0; } } else { for (int k=0;k<3;k++) { buffer[k] = is_raw_mouse_button_pressed(int(MouseIndex[k]),k); } } return; } if (strcmp(buff,"GetWheels") == 0) { double *MouseIndex= (double*)mxGetPr(prhs[1]); if (MouseIndex == NULL) { mwSize dim[2] = {0,0}; plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim, mxDOUBLE_CLASS, mxREAL); return; } int NumEl = mxGetNumberOfElements(prhs[1]); mwSize dim[2] = {1,NumEl}; plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim, mxDOUBLE_CLASS, mxREAL); double *buffer = (double*)mxGetPr(plhs[0]); if (threadId == 0) { mexPrintf("Call The Init Function First!\n"); for (int k=0;k<MAX(dim[0],dim[1]);k++) { buffer[k] = 0; } } else { for (int k=0;k<NumEl;k++) { ULONG Z = get_raw_mouse_z_delta(int(MouseIndex[k])); buffer[k] = double((Z > 4294967295/2) ? double(Z)-4294967295 : Z); } } return; } }