トップページ > 記事閲覧
WM_TOUCHメッセージについて
名前:けーー 日時: 2015/06/06 17:21

DxLibとWINAPIを使用してタッチ入力ができるゲームを作っています。 MSDNの公式サイトに書いてある通りにソースコードを書いてみたのですが、TOUCHEVENTF_UPというタッチしてから指を離したときの動作が認識されません。 これはウィンドウ枠の閉じるボタンや最小化ボタンも同じで押したままの判定となってしまっています。 ほかのウィンドウではこのようなことは起こりませんでした。原因がわかる方いらっしゃいましたら教えていただけませんでしょうか。
メンテ

Page: 1 |

Re: WM_TOUCHメッセージについて ( No.1 )
名前:管理人 日時:2015/06/07 19:59

現在のプログラムを拝見できれば原因がわかるかもしれません よろしければ現象が発生するプログラムをこちらの掲示板に貼り付けていただけないでしょうか? もし長くて貼り付けられないということでしたら、メールでこちら BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください ) に送っていただけないでしょうか?
メンテ
Re: WM_TOUCHメッセージについて ( No.2 )
名前:けーー 日時:2015/06/07 21:55

ソースを複数ファイルにしていたのでまとめ、同じ挙動をすることを確認しました。 #include "DxLib.h" #define MAXPOINTS 10 UINT cInputs; PTOUCHINPUT pInputs; POINT ptInput; int index; int idLookup[MAXPOINTS]; typedef struct{ int x,y; int flag; }TOUCHINFO; TOUCHINFO TouchInfo[MAXPOINTS]; int GetContactIndex(int dwID){ for (int i=0; i < MAXPOINTS; i++){ if (idLookup[i] == -1){ idLookup[i] = dwID; return i; }else{ if (idLookup[i] == dwID){ return i; } } } return -1; } LRESULT CALLBACK WndProc(HWND WindowHandle, UINT Message, WPARAM wParam, LPARAM lParam){ switch(Message){ case WM_TOUCH: cInputs = LOWORD(wParam); pInputs = new TOUCHINPUT[cInputs]; if (pInputs){ if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){ for (int i=0; i < static_cast<INT>(cInputs); i++){ TOUCHINPUT ti = pInputs[i]; index = GetContactIndex(ti.dwID); if (ti.dwID != 0 && index < MAXPOINTS){ ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x); ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y); ScreenToClient(GetMainWindowHandle(), &ptInput); if (ti.dwFlags & TOUCHEVENTF_UP){ TouchInfo[index].x = -1; TouchInfo[index].y = -1; TouchInfo[index].flag = -1; }else{ TouchInfo[index].x = ptInput.x; TouchInfo[index].y = ptInput.y; TouchInfo[index].flag = ti.dwFlags; } } } } CloseTouchInputHandle((HTOUCHINPUT)lParam); delete [] pInputs; } break; } } int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow){ SetGraphMode(1280,720,32); SetHookWinProc(WndProc); DxLib_Init(); RegisterTouchWindow(GetMainWindowHandle(),0); SetDrawScreen(DX_SCREEN_BACK); while(!ProcessMessage()){ ClearDrawScreen(); for(int i = 0;i < MAXPOINTS;i ++){ if((TouchInfo[i].flag & TOUCHEVENTF_DOWN) || (TouchInfo[i].flag & TOUCHEVENTF_MOVE)){ DrawCircle(TouchInfo[i].x,TouchInfo[i].y,40,GetColor(255,0,0),TRUE); } } ScreenFlip(); } DxLib_End(); UnregisterTouchWindow(GetMainWindowHandle()); return 0; }
メンテ
Re: WM_TOUCHメッセージについて ( No.3 )
名前:管理人 日時:2015/06/07 23:07

ソースの貼り付けありがとうございます タッチに対応した WindowsOSのデバイスがないので実際にテストすることができないのですが、 ソースを拝見する限りで試す価値がありそうなものとして WndProcの関数の最後の箇所に SetUseHookWinProcReturnValue( TRUE ) ; return 0 ; という記述を追加してみる、というのがあります SetHookWinProc で登録する関数が返す値は何もしないとDXライブラリは無視するので、 return の前に SetUseHookWinProcReturnValue( TRUE ) ; を実行して戻り値を使うようにすると 何か動作に変化があるかもしれません よろしければお試しください あと、タッチに対応した WindowsOSのデバイスをなるべく早く用意して手元でテストできる環境を整えたいと思います m(- -;m
メンテ
Re: WM_TOUCHメッセージについて ( No.4 )
名前:けーー 日時:2015/06/08 00:32

返信ありがとうございます。またソースを書く上で改善が見られたら書き込みたいと思います。
メンテ
Re: WM_TOUCHメッセージについて ( No.5 )
名前:管理人 日時:2015/06/09 23:36

タッチに対応した WindowsOS のデバイス( Surface Pro 3 )を手に入れたので No.2 に 載せていただいたプログラムをこちらでも試してみました 結果、少なくとも私の環境では TOUCHEVENTF_UP が問題なく発生していました ただ、No.2 に載せていただいたプログラムでは幾つか問題があり、複数の点をタッチした際や TOUCHEVENTF_UP が発生した後に正常に動作しなくなってしまうようになっていましたので、 それらの問題が発生しないようにしてみました よろしければこちらのプログラムでけーーさんの環境でも正常に動作するかお試しになってみてください m(_ _)m #include "DxLib.h" #define MAXPOINTS 10 UINT cInputs; PTOUCHINPUT pInputs; POINT ptInput; int index; int idLookup[MAXPOINTS]; typedef struct { int x, y; int flag; }TOUCHINFO; TOUCHINFO TouchInfo[MAXPOINTS]; int GetContactIndex(int dwID) { // 既にIDが登録されているか調べる for (int i = 0; i < MAXPOINTS; i++) { if (idLookup[i] == dwID) { return i; } } // IDが登録されていなかったら空いているスロットを探す for (int i = 0; i < MAXPOINTS; i++) { if (idLookup[i] == -1) { idLookup[i] = dwID; return i; } } return -1; } LRESULT CALLBACK WndProc(HWND WindowHandle, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { case WM_TOUCH: cInputs = LOWORD(wParam); pInputs = new TOUCHINPUT[cInputs]; if (pInputs) { if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))) { for (int i = 0; i < static_cast<INT>(cInputs); i++) { TOUCHINPUT ti = pInputs[i]; index = GetContactIndex(ti.dwID); if ( index >= 0 ) { ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x); ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y); ScreenToClient(GetMainWindowHandle(), &ptInput); if (ti.dwFlags & TOUCHEVENTF_UP) { // TOUCHEVENTF_UP だったらスロットを無効にする idLookup[index] = -1; } else { TouchInfo[index].x = ptInput.x; TouchInfo[index].y = ptInput.y; TouchInfo[index].flag = ti.dwFlags; } } } } CloseTouchInputHandle((HTOUCHINPUT)lParam); delete[] pInputs; } break; } return 0; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { SetGraphMode(1280, 720, 32); SetHookWinProc(WndProc); DxLib_Init(); // すべてのスロットを無効にする for (int i = 0; i < MAXPOINTS; i++) { idLookup[i] = -1; } RegisterTouchWindow(GetMainWindowHandle(), 0); SetDrawScreen(DX_SCREEN_BACK); while (!ProcessMessage()) { ClearDrawScreen(); for (int i = 0;i < MAXPOINTS;i++) { // スロットが無効だったら何もしない if( idLookup[i] == -1 ){ continue; } if ((TouchInfo[i].flag & TOUCHEVENTF_DOWN) || (TouchInfo[i].flag & TOUCHEVENTF_MOVE)) { DrawCircle(TouchInfo[i].x, TouchInfo[i].y, 40, GetColor(255, 0, 0), TRUE); } } ScreenFlip(); } DxLib_End(); UnregisterTouchWindow(GetMainWindowHandle()); return 0; }
メンテ
Re: WM_TOUCHメッセージについて ( No.6 )
名前:けーー(解決) 日時:2015/07/20 17:09

返信が大変遅れてしまい申し訳ございません。 私の環境でも仰る通りのコードで動作しました。 アドバイスありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存