[解決済み] マウスボタンが押されたときにWM_LBUTTONDOWNがすぐに送信されない
質問
Windows 10のC++で、マウスの左ボタンが押されたことを正確に検出できないのですが。
2つの方法を試してみました。
-
キャッチ
WM_LBUTTONDOWN
メッセージ -
直接使用
GetKeyState(VK_LBUTTON)
毎回、同じような動作になる.
1秒の間に左ボタンを押すと
-
は
WM_LBUTTONDOWN
を押してから約0.5秒後に送信されます。 左ボタン -
その
GetKeyState(VK_LBUTTON)
WM_LBUTTONDOWNが送信されたとき、つまりマウスボタンを押してから0.5秒後に値が変更されます。
その
WM_LBUTTONDOWN
が送信されます。
- をクリックするだけで 左ボタンで
- マウスを押し下げると マウスを移動させながら
でも、まだわからない を即座に検出する方法 マウスを動かさずに左ボタンを長押しした場合、左ボタンが押されている時に 私の知らないイベントがあるのでしょうか? 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のようなマウス認識エンジンをお使いでしょうか? それはあなたの問題を説明することができます。
関連
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】'cout'は型名ではない
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Enterキーを押して続行する