前提・実現したいこと
mfcを用いて、マウスの移動量を読み取るアプリケーションの開発をしているのですが
マウスの移動量を検出することができていません。
デバイス登録はできていることを確認しています。
発生している問題・エラーメッセージ
rawinputでマウスのデータを読み取れない ソースコードにおけるOnRawInputが実行されない
該当のソースコード
C++ MFC #include "stdafx.h" #include "MFCApplication3.h" #include "MFCApplication3Dlg.h" #include "afxdialogex.h" #include <afxwin.h > RAWINPUTHEADER g_header[12]; RAWMOUSE g_mouseInfo[12]; UINT nInputcode = 0; HRAWINPUT hRawInput = 0; LONG mouse_x_move[5]; LONG mouse_y_move[5]; LONG mouse_x_spd[5]; LONG mouse_y_spd[5]; RAWINPUT pRAWINPUT; HANDLE deviceID[10]; CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_MFCAPPLICATION3_DIALOG, pParent){ for (int i = 0; i < 10; i++) { m_mouseData[i] = 0; } flg_run = 0; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCApplication3Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); for (int i = 0; i < 5; i++) { DDX_Text(pDX, IDC_STATIC_1 + i, m_mouseData[i]); } } BEGIN_MESSAGE_MAP(CMFCApplication3Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, &CMFCApplication3Dlg::OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, &CMFCApplication3Dlg::OnBnClickedCancel) ON_BN_CLICKED(IDC_start, &CMFCApplication3Dlg::OnBnClickedstart) ON_BN_CLICKED(IDC_reset, &CMFCApplication3Dlg::OnBnClickedreset) ON_WM_TIMER() ON_WM_INPUT() ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication3Dlg::OnBnClickedButton1) END_MESSAGE_MAP() CDialogEx::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します。 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 // Framework は、この設定を自動的に行います。 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 // TODO: 初期化をここに追加します。 // 現在接続されている入力デバイスの数を取得 UINT deviceNum = 0; UINT i = 0; HWND hwnd=NULL; GetRawInputDeviceList(NULL, &deviceNum, sizeof(RAWINPUTDEVICELIST)); // デバイス情報用構造体 RAWINPUTDEVICELIST* deviceList = new RAWINPUTDEVICELIST[deviceNum]; // デバイス情報の取得 if (GetRawInputDeviceList(deviceList, &deviceNum, sizeof(RAWINPUTDEVICELIST)) != deviceNum) { } else { } for (i = 0; i < 10; i++) { deviceID[i] = deviceList[i].hDevice; } // WM_INPUTで受け取れるように登録 RAWINPUTDEVICE device[1]; device[0].usUsagePage = 0x01; // マウス用の定数 device[0].usUsage = 0x02; // マウス用の定数 device[0].dwFlags = 0x00; device[0].hwndTarget = *this; //device[0].hwndTarget = hwnd; if (RegisterRawInputDevices(device, 1, sizeof(device[0])) == false) { } void CMFCApplication3Dlg::OnRawInput(UINT nInputcode, HRAWINPUT hRawInput) { LPARAM lp=NULL; UINT dwSize; GetRawInputData((HRAWINPUT)lp, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); unsigned char* lpb = new unsigned char[dwSize]; if (lpb == NULL) { // エラー return ; } if (GetRawInputData((HRAWINPUT)lp, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize) { // エラー } RAWINPUT* raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEMOUSE) { for (int i = 0; i < 10; i++) { if (raw->header.hDevice == deviceID[i]) { g_mouseInfo[i] = raw->data.mouse; g_header[i] = raw->header; m_mouseData[i] += g_mouseInfo[i].lLastX; } } delete[] lpb; } CDialogEx::OnRawInput(nInputcode, hRawInput); }
試したこと
Microsoftのusing raw inputを閲覧しサンプルプログラムを参考にコードを書き直したりしましたが、マウスの生データを得ることができませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー