2017-11-18 19 views
-3

Windows 10ではC++でマウスの左ボタンが押されたときを正確に検出できません。私は左を押すと
:動作は同じで、直接GetKeyState(VK_LBUTTON)マウスボタンが押されたときにすぐにWM_LBUTTONDOWNが送信されない

たびを使用してWM_LBUTTONDOWNメッセージ

  • を引く

    1. は、私は2つの方法を試してみましたボタンを1秒間押すと

      0123私はWM_LBUTTONDOWNは私がマウスボタンを押した0.5秒後を意味し、送信された正確にいつ

    2. GetKeyState(VK_LBUTTON)値が変更を返さ左ボタンを押した 押した後

      1. WM_LBUTTONDOWNは、約0.5秒に送信され

      WM_LBUTTONDOWNが送信されます。

      1. マウスに

      を動かしながら、私はダウンマウスを押してくださいしかし、私はまだ左のボタンが中にダウンした場合、直ちにを検出する方法をがわからない場合、私は左のボタン

    3. のみをクリックした場合マウスを動かさずに左ボタンを長押しした場合。 私にはわからないイベントはありますか? Windowsは私たちにその方法を思考させ、その "クリック"と "移動"を使用させますか?つまり、マウスボタンが押されたときに正確に検出する方法はありませんか? WindowsのC++で左ボタンが押されたときを正確に検出する方法は?


      EDIT:

      は、あなたの答えをいただき、ありがとうございます。 私は最小限の完全で検証可能なコードを作成しました。

      以下のプログラムはVisual C++でコンパイルします。2017 GetMessageがメッセージを取得するたびに移動する青色の四角形が表示されます。 この矩形は赤色になり、WM_LBUTTONDOWNが検出されると変換されます。

      私の最初の記事で説明したように、クリックするかマウスを動かしながらマウスボタンを押したときに矩形が赤く表示されますが、マウスを押していると赤くなるのに約0.5秒かかりますマウスを動かさないでください。

      もう一度ご協力いただきありがとうございます。ここで

      はコードです:

      #include <Windows.h> 
      #include <GL/GL.h> 
      #include <math.h> 
      #pragma comment(lib, "opengl32.lib") 
      
      HDC hdc; 
      HGLRC hrc; 
      bool ButtonL; 
      
      void MyDisplay() 
      { 
          static float kk=0; kk+=0.04f; 
          glMatrixMode(GL_MODELVIEW); glLoadIdentity();glTranslated(0.5*sin(kk),0,0); 
          glMatrixMode(GL_PROJECTION); glLoadIdentity(); 
          glClearColor(0, 0, 0, 0); 
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
          if ((GetKeyState(VK_LBUTTON) & 0x100) != 0) glColor3f(1,0,0); else glColor3f(0,0,1); 
          if (ButtonL) glTranslated(0,-0.5,0); 
          glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(0,1); glVertex2f(1,1); glVertex2f(1,0); glEnd(); 
      } 
      LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
      { 
           switch (uMsg) 
           { 
            case WM_LBUTTONDOWN : ButtonL=true; break; 
            case WM_LBUTTONUP : ButtonL=false; break; 
           } 
           return DefWindowProc(hWnd,uMsg,wParam,lParam); 
      } 
      
      int main(int argc, char** argv) 
      { 
          ButtonL=false; 
          WNDCLASS wc;   
          RECT  WindowRect; 
          WindowRect.left =(long)0; WindowRect.right =(long)400; 
          WindowRect.top =(long)0; WindowRect.bottom =(long)300; 
          HINSTANCE hInstance  = GetModuleHandle(NULL);   
          wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 
          wc.lpfnWndProc  = (WNDPROC) WndProc;      
          wc.cbClsExtra  = 0;        
          wc.cbWndExtra  = 0;       
          wc.hInstance  = hInstance;      
          wc.hIcon   = LoadIcon(NULL, IDI_WINLOGO); 
          wc.hCursor   = LoadCursor(NULL, IDC_ARROW); 
          wc.hbrBackground = NULL;       
          wc.lpszMenuName  = NULL;       
          wc.lpszClassName = "OpenGL";      
      
          if (!RegisterClass(&wc)) return(0); 
      
          AdjustWindowRectEx(&WindowRect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE);  
          HWND hWnd=CreateWindowEx( WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,"OpenGL","Titre",WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 
                 WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL); 
          PIXELFORMATDESCRIPTOR pfd= 
          { sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,32, 0, 0, 0, 0, 0, 0,    
           0,0,0,0, 0, 0, 0,16,0,0,PFD_MAIN_PLANE,0,0, 0, 0        
          }; 
      
          hdc=GetDC(hWnd); 
          GLuint PixelFormat=ChoosePixelFormat(hdc,&pfd); 
          SetPixelFormat(hdc,PixelFormat,&pfd); 
          hrc = wglCreateContext(hdc); 
          wglMakeCurrent(hdc , hrc); 
          ShowWindow(hWnd,SW_SHOW);    // Show The Window 
          SetForegroundWindow(hWnd);    // Slightly Higher Priority 
          SetFocus(hWnd);      // Sets Keyboard Focus To The Window 
      
          MSG Msg; 
          while(GetMessage(&Msg, hWnd, 0, 0) != 0) 
          { 
           TranslateMessage(&Msg); 
           DispatchMessage(&Msg); 
           MyDisplay(); 
           SwapBuffers(hdc); 
          } 
          return 0; 
      } 
      
  • +2

    送信されません。投稿されています。即座にメッセージキューに追加されます。あなたのプログラムがそれを読むとき、それは予測できません。前のメッセージの処理と同様です。また、GetKeyState()はGetMessage()呼び出しと同期しています。 MSG.timeメンバの使用を検討してください。精度はデフォルトで約16ミリ秒です。 –

    +1

    半分の時間は正しく聞こえません。おそらくあなたのプログラムに間違っています。あなただけがそれを見ることができます。 –

    +0

    関連コードを掲示する – Asesh

    答えて

    2

    あなたのプログラムは、自分のコンピュータ上で正常に動作します:私はダウンボタンを押したとき、私は任意の遅延に気づくことはありません。 Windowsのメッセージは、ご使用のコンピュータの非常に低いレベルで傍受されているようです。 "Sensiva"や "Just Gesture"や "Stroke it"のようなマウス認識エンジンを使用していますか? これはあなたの問題を説明することができます。

    +0

    それは信じられないほどのように、それが解決策でした!実際に、私は "Just Gesture"を使用します。このプログラムを無効にすると、0.5秒の遅延が消滅します。 私はそのようなプログラムがWindowsメッセージを傍受してC++プログラムを邪魔する方法を理解できませんが、それは別の質問です..! – Xhilbert

    +0

    「Just Gesture」は、お使いのコンピュータで動作している他のプログラムでは問題は発生しませんが、プログラムに問題が発生する可能性があります。あなたのプログラムと他のプログラムの違いは何ですか?あなたのメッセージループの目障りなエラーは容疑者です。 –

    関連する問題