teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加情報

2018/11/14 08:20

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -182,4 +182,55 @@
182
182
  ```text
183
183
  c:****\mfcapplication21\mfcapplication21\mfcapplication21dlg.cpp(171) : atlTraceGeneral - OnRawInput called
184
184
  ...
185
- ```
185
+ ```
186
+
187
+ ----
188
+
189
+ 追記:2018/11/14 17:17
190
+
191
+ 第一引数に勝手にでっちあげたlp(NULL)を渡しているので、関数が失敗しており、必要なサイズがdwSizeに書き込まれていません。
192
+
193
+ > LPARAM lp=NULL;
194
+ > GetRawInputData((HRAWINPUT)lp, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
195
+
196
+ 以下のようにすれば、より良くなるでしょう。
197
+
198
+ ```cpp
199
+ void CMFCApplication21Dlg::OnRawInput(UINT nInputcode, HRAWINPUT hRawInput)
200
+ {
201
+ UINT dwSize = 0;
202
+ GetRawInputData(hRawInput, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
203
+ unsigned char* lpb = new unsigned char[dwSize];
204
+ if (lpb == NULL)
205
+ {
206
+ // エラー
207
+ return ;
208
+ }
209
+ if (GetRawInputData(hRawInput, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize)
210
+ {
211
+
212
+ // エラー
213
+ }
214
+ RAWINPUT* raw = (RAWINPUT*)lpb;
215
+
216
+ if (raw->header.dwType == RIM_TYPEMOUSE) {
217
+ for (int i = 0; i < 10; i++) {
218
+ if (raw->header.hDevice == deviceID[i]) {
219
+ g_mouseInfo[i] = raw->data.mouse;
220
+ g_header[i] = raw->header;
221
+ m_mouseData[i] += g_mouseInfo[i].lLastX;
222
+ }
223
+ }
224
+
225
+ }
226
+
227
+ delete[] lpb;
228
+ CDialogEx::OnRawInput(nInputcode, hRawInput);
229
+ }
230
+ ```
231
+
232
+ 本題とはそれますが、気になった点も挙げておきます。
233
+
234
+ * APIはエラー処理を正しくやりましょう。
235
+ * グローバル変数を使うのは極力やめましょう。
236
+ * '10'といったマジックナンバーを使うのはやめましょう(#defineかenumかvectorのような可変長配列を使いましょう)