回答編集履歴

1

追加情報

2018/11/14 08:20

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -367,3 +367,105 @@
367
367
  ...
368
368
 
369
369
  ```
370
+
371
+
372
+
373
+ ----
374
+
375
+
376
+
377
+ 追記:2018/11/14 17:17
378
+
379
+
380
+
381
+ 第一引数に勝手にでっちあげたlp(NULL)を渡しているので、関数が失敗しており、必要なサイズがdwSizeに書き込まれていません。
382
+
383
+
384
+
385
+ > LPARAM lp=NULL;
386
+
387
+ > GetRawInputData((HRAWINPUT)lp, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
388
+
389
+
390
+
391
+ 以下のようにすれば、より良くなるでしょう。
392
+
393
+
394
+
395
+ ```cpp
396
+
397
+ void CMFCApplication21Dlg::OnRawInput(UINT nInputcode, HRAWINPUT hRawInput)
398
+
399
+ {
400
+
401
+ UINT dwSize = 0;
402
+
403
+ GetRawInputData(hRawInput, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
404
+
405
+ unsigned char* lpb = new unsigned char[dwSize];
406
+
407
+ if (lpb == NULL)
408
+
409
+ {
410
+
411
+ // エラー
412
+
413
+ return ;
414
+
415
+ }
416
+
417
+ if (GetRawInputData(hRawInput, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize)
418
+
419
+ {
420
+
421
+
422
+
423
+ // エラー
424
+
425
+ }
426
+
427
+ RAWINPUT* raw = (RAWINPUT*)lpb;
428
+
429
+
430
+
431
+ if (raw->header.dwType == RIM_TYPEMOUSE) {
432
+
433
+ for (int i = 0; i < 10; i++) {
434
+
435
+ if (raw->header.hDevice == deviceID[i]) {
436
+
437
+ g_mouseInfo[i] = raw->data.mouse;
438
+
439
+ g_header[i] = raw->header;
440
+
441
+ m_mouseData[i] += g_mouseInfo[i].lLastX;
442
+
443
+ }
444
+
445
+ }
446
+
447
+
448
+
449
+ }
450
+
451
+
452
+
453
+ delete[] lpb;
454
+
455
+ CDialogEx::OnRawInput(nInputcode, hRawInput);
456
+
457
+ }
458
+
459
+ ```
460
+
461
+
462
+
463
+ 本題とはそれますが、気になった点も挙げておきます。
464
+
465
+
466
+
467
+ * APIはエラー処理を正しくやりましょう。
468
+
469
+ * グローバル変数を使うのは極力やめましょう。
470
+
471
+ * '10'といったマジックナンバーを使うのはやめましょう(#defineかenumかvectorのような可変長配列を使いましょう)