回答編集履歴
1
追加情報
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のような可変長配列を使いましょう)
|