Windows 10ではC++でマウスの左ボタンが押されたときを正確に検出できません。私は左を押すと
:動作は同じで、直接GetKeyState(VK_LBUTTON)
マウスボタンが押されたときにすぐにWM_LBUTTONDOWNが送信されない
たびを使用してWM_LBUTTONDOWN
メッセージ
を引く
:
は、私は2つの方法を試してみましたボタンを1秒間押すと 0123私はWM_LBUTTONDOWNは私がマウスボタンを押した0.5秒後を意味し、送信された正確にいつGetKeyState(VK_LBUTTON)
値が変更を返さ左ボタンを押した 押した後WM_LBUTTONDOWN
は、約0.5秒に送信され
WM_LBUTTONDOWN
が送信されます。- マウスに
を動かしながら、私はダウンマウスを押してくださいしかし、私はまだ左のボタンが中にダウンした場合、直ちにを検出する方法をがわからない場合、私は左のボタン
- でのみをクリックした場合マウスを動かさずに左ボタンを長押しした場合。 私にはわからないイベントはありますか? 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; }
送信されません。投稿されています。即座にメッセージキューに追加されます。あなたのプログラムがそれを読むとき、それは予測できません。前のメッセージの処理と同様です。また、GetKeyState()はGetMessage()呼び出しと同期しています。 MSG.timeメンバの使用を検討してください。精度はデフォルトで約16ミリ秒です。 –
半分の時間は正しく聞こえません。おそらくあなたのプログラムに間違っています。あなただけがそれを見ることができます。 –
関連コードを掲示する – Asesh