#include #include #define DIRECTINPUT_VERSION 0x0800 #include #define RELEASE(x) if(x){x->Release();x=NULL;} #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 HINSTANCE g_Inst; HWND g_hWnd; LPCSTR szAppName = "DirectInput"; LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,UINT wParam,LONG lParam); int bActive = 0; LPDIRECTINPUT8 pDI; LPDIRECTINPUTDEVICE8 pDIKeyboad; LPDIRECTINPUTDEVICE8 pDIMouse; int initDInput(void){ DIPROPDWORD dipdw; if(FAILED(DirectInput8Create(g_Inst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&pDI, NULL))){ return 0; } // キーボードの設定 if(FAILED(pDI->CreateDevice(GUID_SysKeyboard, &pDIKeyboad, NULL))){ return 0; } if(FAILED(pDIKeyboad->SetDataFormat(&c_dfDIKeyboard))){ return 0; } if(FAILED(pDIKeyboad->SetCooperativeLevel(g_hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))){ return 0; } // マウスの設定 if(FAILED(pDI->CreateDevice(GUID_SysMouse, &pDIMouse, NULL))){ return 0; } if(FAILED(pDIMouse->SetDataFormat(&c_dfDIMouse2))){ return 0; } if(FAILED(pDIMouse->SetCooperativeLevel(g_hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))){ return 0; } dipdw.diph.dwSize = sizeof(DIPROPDWORD); dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); dipdw.diph.dwObj = 0; dipdw.diph.dwHow = DIPH_DEVICE; dipdw.dwData = DIPROPAXISMODE_REL; // DIPROPAXISMODE_ABS if(FAILED(pDIMouse->SetProperty(DIPROP_AXISMODE, &dipdw.diph))){ return 0; } if(pDIKeyboad)pDIKeyboad->Acquire(); if(pDIMouse)pDIMouse->Acquire(); return 1; } void deinitDInput(void){ if(pDIKeyboad)pDIKeyboad->Unacquire(); if(pDIMouse)pDIMouse->Unacquire(); RELEASE(pDIKeyboad); RELEASE(pDIMouse); RELEASE(pDI); } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam){ switch(msg){ case WM_ACTIVATE: bActive = HIWORD(wParam)?0:1; if(pDIKeyboad){ if(WA_INACTIVE == wParam){ pDIKeyboad->Unacquire(); pDIMouse->Unacquire(); } else{ pDIKeyboad->Acquire(); pDIMouse->Acquire(); } } break; case WM_KEYDOWN: switch(wParam){ case VK_ESCAPE: PostMessage(hWnd, WM_CLOSE, 0, 0); break; default: break; } break; case WM_PAINT: #define KEYDOWN(name, key) (name[key] & 0x80) char s[64]; char buffer[256]; RECT rt; HDC hdc; PAINTSTRUCT ps; DIMOUSESTATE2 dims; sprintf(s, "%s", "none"); // キーボードの状態を取得 if(pDIKeyboad){ pDIKeyboad->GetDeviceState(sizeof(buffer), (LPVOID)&buffer); if(KEYDOWN(buffer, DIK_RIGHT)){ sprintf(s, "key:%s", "right"); } else if(KEYDOWN(buffer, DIK_LEFT)){ sprintf(s, "key:%s", "left"); } else if(KEYDOWN(buffer, DIK_UP)){ sprintf(s, "key:%s", "up"); } else if(KEYDOWN(buffer, DIK_DOWN)){ sprintf(s, "key:%s", "down"); } } // マウスの状態を取得 if(pDIMouse){ pDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), (LPVOID)&dims); if(dims.rgbButtons[0]){ sprintf(s, "mouse:%s", "left"); } else if(dims.rgbButtons[1]){ sprintf(s, "mouse:%s", "right");h } else if(dims.rgbButtons[2]){ sprintf(s, "mouse:%s", "center"); } if(dims.lX || dims.lY){ sprintf(s, "mouse(x,y):(%d,%d)", dims.lX, dims.lY); } else if(dims.lZ){ sprintf(s, "mouse(z):%d", dims.lZ); } } hdc = BeginPaint (hWnd, &ps); GetClientRect(hWnd, &rt); DrawText(hdc, s, strlen(s), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_IME_NOTIFY: // break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0L; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){ int result; int cx, cy; WNDCLASS wc; MSG msg; g_Inst=hInst; if(!hPrevInst){ wc.lpszClassName = "DirectInput"; wc.lpfnWndProc = WndProc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.hInstance = hInst; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; if(!RegisterClass(&wc)){ return 0; } } cx = SCREEN_WIDTH + GetSystemMetrics(SM_CXDLGFRAME) * 2; cy = SCREEN_HEIGHT + GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION); g_hWnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, cx, cy, (HWND)NULL, (HMENU)NULL, hInst, (LPSTR)NULL); ShowWindow(g_hWnd, nCmdShow); UpdateWindow(g_hWnd); result = initDInput(); if(result == 0){ goto fin; } while(GetMessage(&msg, NULL, 0, 0)){ InvalidateRect(g_hWnd, NULL, TRUE); TranslateMessage(&msg); DispatchMessage(&msg); } fin: deinitDInput(); return msg.wParam; }