【发布时间】:2020-06-06 12:10:19
【问题描述】:
我的鼠标偶尔会双击,现在我正在尝试构建一个工具来检测无效的 mouseup/mousdowns 并阻止它们传播。
双击实际上是鼠标失去联系然后再次接收触发(类似于短路但没有电)。如果我尝试拖动(例如通过选择文本),它会变得非常清晰:鼠标多次失去拖动。现在我试图忽略此类中间鼠标向上事件和以下鼠标向下事件,如果它连续发生以防止这种情况发生。
我设法使用 JNA 挂钩和阻止事件。但是,我的问题有点复杂:我只知道如果 mousedown 事件发生的时间少于 ms,我应该阻止 mouseup 事件,所以实际上我首先必须阻止 mouseup 事件,等待 ms,然后触发 mouseup事件(如果在此期间没有检测到 mousedown)或什么都不做(如果在容忍时间内发生 mousedown 事件,顺便说一句也应该被阻止)。但是,我只设法找出了如何广播 mouseup 事件(这总是触发点击 windows 按钮,所以我猜它不包括位置),但不知道如何正确触发我的实际 mouseup 事件一开始就被屏蔽了。
这是我的实现,它进行了适当的阻止,但之后错误地触发了点击(请注意,这不是实现,而只是用于测试模拟事件的简化版本)。
public class LowLevelMouseProcImpl implements LowLevelMouseProc {
private User32 userInstance;
private HHOOK hhk;
private final HWND HWND_BROADCAST = new HWND(Pointer.createConstant(0xFFFF));
public LowLevelMouseProcImpl(User32 userInstance, AtomicBoolean threadFinish) {
this.userInstance = userInstance;
}
@Override
public void setHook(HHOOK hook) {
hhk = hook;
}
@Override
public LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0) {
return userInstance.CallNextHookEx(hhk, nCode, wParam, lParam);
}
switch (wParam.intValue()) {
case MouseHook.WM_LBUTTONUP:
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
userInstance.PostMessage(HWND_BROADCAST, MouseHook.WM_LBUTTONUP, wParam, lParam);
//userInstance.CallNextHookEx(hhk, nCode, wParam, lParam);
}).start();
return new LRESULT(1);
// break;
case MouseHook.WM_RBUTTONUP:
break;
case MouseHook.WM_LBUTTONDOWN:
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
userInstance.PostMessage(HWND_BROADCAST, MouseHook.WM_LBUTTONDOWN, wParam, lParam);
}).start();
return new LRESULT(1);
// break;
case MouseHook.WM_RBUTTONDOWN:
break;
default:
break;
}
return userInstance.CallNextHookEx(hhk, nCode, wParam, lParam);
}
}
任何想法我可以如何正确发布消息?
【问题讨论】:
-
无效双击是如何定义的?如果是正常的双击,应该怎么区分?
-
与问题无关。因为我遇到了点击后自动变成双击的问题,最后我发现“开启ClickLock”应该是没有选中的。看到这个screensnap。
-
ClickLock 与我的问题无关,因为我说这是硬件问题。我在第二段中描述了如何检测到无效的双击。也许我描述的有点不正确。我会更新描述。
-
这个时间很难控制。因为当按下鼠标左键时,会出现多个鼠标丢失事件。这使得获得双击时间变得困难。也就是说,只要你按下鼠标左键,丢失鼠标的事件就会不断发生。我的建议是求鼠标丢失的平均时间,并在平均时间内防止mousedown事件和mouseup事件发生。当然,这个方法很粗糙,但是除了这个方法之外,我想不出其他可以获取你实际鼠标释放事件的方法了。
-
是的,这就是我最初的意图。我的问题不是关于如何在理论上完成,而是如何在实践中完成。为了阻止一个事件并在以后(或不)触发它,我需要一种正确触发它的方法。这就是我的全部问题。
标签: java winapi callback mouseevent jna