低级鼠标钩子 - 鼠标按钮单击与按住
Low level mouse hook - mouse button click vs hold
我正在使用 C++ 和 DirectD3D9 绘制菜单。
我想用鼠标浏览菜单。
我可以获得鼠标位置,但是,检查是否单击了左键被证明是棘手的。
我可以检查它是否被按住,但没有被点击。
bool LBUTTONDOWN = false;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN)) {
LBUTTONDOWN = wParam == WM_LBUTTONDOWN;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
如何添加检查以查看是否单击了左侧按钮?
没有 LowLevelMouseProc 的 DoubleClick 消息。不过,我想你可以解决这个问题:
记录LBUTTONDOWN和LBUTTONUP之间的时间间隔,然后检查是否足够快成为点击事件。而且由于鼠标动作非常快,所以最好为鼠标捕捉设置一个定时器。
对于鼠标捕获,您仍然可以调用LowLevelMouseProc。但是,DirectInput更方便处理鼠标移动。
在 DirectX SDK 示例中,有一个名为 "CustomFormat" 的 DirectInput 示例。它显示了如何设置计时器来捕获鼠标输入。
希望对您有所帮助。
你需要使用计时技巧。创建一个名为 'nTime' 的变量,
当 LButton 向上时,将其设置为零。当 LButton 关闭时使用“+=”运算符增加变量值,并根据类似的值检查变量 -
bool LBUTTONDOWN = false;
int nTime = 0;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN))
{
LBUTTONDOWN = wParam == WM_LBUTTONDOWN;
if ( LBUTTONDOWN )
{
nTime += 1;
if ( nTime > 1000 /*( this value depends on you )*/ )
{
nTime = 0;
// Here is your hold event code.
}
}
else
nTime = 0;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
我正在使用 C++ 和 DirectD3D9 绘制菜单。 我想用鼠标浏览菜单。 我可以获得鼠标位置,但是,检查是否单击了左键被证明是棘手的。 我可以检查它是否被按住,但没有被点击。
bool LBUTTONDOWN = false;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN)) {
LBUTTONDOWN = wParam == WM_LBUTTONDOWN;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
如何添加检查以查看是否单击了左侧按钮?
没有 LowLevelMouseProc 的 DoubleClick 消息。不过,我想你可以解决这个问题:
记录LBUTTONDOWN和LBUTTONUP之间的时间间隔,然后检查是否足够快成为点击事件。而且由于鼠标动作非常快,所以最好为鼠标捕捉设置一个定时器。
对于鼠标捕获,您仍然可以调用LowLevelMouseProc。但是,DirectInput更方便处理鼠标移动。
在 DirectX SDK 示例中,有一个名为 "CustomFormat" 的 DirectInput 示例。它显示了如何设置计时器来捕获鼠标输入。
希望对您有所帮助。
你需要使用计时技巧。创建一个名为 'nTime' 的变量, 当 LButton 向上时,将其设置为零。当 LButton 关闭时使用“+=”运算符增加变量值,并根据类似的值检查变量 -
bool LBUTTONDOWN = false;
int nTime = 0;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN))
{
LBUTTONDOWN = wParam == WM_LBUTTONDOWN;
if ( LBUTTONDOWN )
{
nTime += 1;
if ( nTime > 1000 /*( this value depends on you )*/ )
{
nTime = 0;
// Here is your hold event code.
}
}
else
nTime = 0;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}