1. ホーム
  2. c++

[解決済み] マウスボタンが押されたときにWM_LBUTTONDOWNがすぐに送信されない

2022-02-15 12:57:18

質問

Windows 10のC++で、マウスの左ボタンが押されたことを正確に検出できないのですが。

2つの方法を試してみました。

  1. キャッチ WM_LBUTTONDOWN メッセージ

  2. 直接使用 GetKeyState(VK_LBUTTON)

毎回、同じような動作になる.
1秒の間に左ボタンを押すと

  1. WM_LBUTTONDOWN を押してから約0.5秒後に送信されます。 左ボタン

  2. その GetKeyState(VK_LBUTTON) WM_LBUTTONDOWNが送信されたとき、つまりマウスボタンを押してから0.5秒後に値が変更されます。

その WM_LBUTTONDOWN が送信されます。

  1. をクリックするだけで 左ボタンで
  2. マウスを押し下げると マウスを移動させながら

でも、まだわからない を即座に検出する方法 マウスを動かさずに左ボタンを長押しした場合、左ボタンが押されている時に 私の知らないイベントがあるのでしょうか? Windowsは無理やり考えて、"CLICK"と"MOUSEDOWN"を使っているのでしょうか?つまり、マウスのボタンが押されたことを正確に検出する方法はないのでしょうか? 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;
}

解決方法は?

あなたのプログラムは私のコンピュータで問題なく動作します:ボタンを押したときに遅延を感じることはありません。 あなたのコンピュータでは、ウィンドウズ・メッセージは非常に低いレベルで傍受されているようです。 SensivaやJust Gesture、Stroke itのようなマウス認識エンジンをお使いでしょうか? それはあなたの問題を説明することができます。