SetWindowsHookEx,按下鼠标按钮时执行代码
SetWindowsHookEx, execute code while mouse button is pressed
所以我使用 SetWindowsHookEx()
制作了一个全局热键。我想让它做的是当我按下鼠标右键时它应该一次又一次地执行一些代码。问题是,如果我按下鼠标右键,它只会执行一次。
这是我的回调函数:
private static IntPtr ButtonHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
if (wParam == (IntPtr)WM_RBUTTONDOWN)
{
_m.rtbLog.AppendText("Right mouse button was clicked \n");
}
else if (wParam == (IntPtr)WM_LBUTTONDOWN)
{
_m.rtbLog.AppendText("Left mouse button was clicked \n");
}
}
return CallNextHookEx(MainWindow._hookId, nCode, wParam, lParam);
}
我无法准确判断你的意图,但我猜你需要结合 WM_RBUTTONDOWN
和 WM_RBUTTONUP
来实现你想要的。 while WM_RBUTTONDOWN
,开始循环做某事,while WM_RBUTTONUP
,停止做。
private static IntPtr ButtonHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
if (wParam == (IntPtr)WM_RBUTTONDOWN)
{
Start();
}
else if (wParam == (IntPtr)WM_RBUTTONUP)
{
Stop();
}
}
return CallNextHookEx(MainWindow._hookId, nCode, wParam, lParam);
}
private static void Satrt()
{
_toStop = false;
while (true)
{
if (_toStop)
{
_toStop = false;
return;
}
DoTask();
}
}
private static void Stop()
{
_toStop = true;
}
private static void DoTask()
{
// do something
}
private static bool _toStop;
所以我使用 SetWindowsHookEx()
制作了一个全局热键。我想让它做的是当我按下鼠标右键时它应该一次又一次地执行一些代码。问题是,如果我按下鼠标右键,它只会执行一次。
这是我的回调函数:
private static IntPtr ButtonHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
if (wParam == (IntPtr)WM_RBUTTONDOWN)
{
_m.rtbLog.AppendText("Right mouse button was clicked \n");
}
else if (wParam == (IntPtr)WM_LBUTTONDOWN)
{
_m.rtbLog.AppendText("Left mouse button was clicked \n");
}
}
return CallNextHookEx(MainWindow._hookId, nCode, wParam, lParam);
}
我无法准确判断你的意图,但我猜你需要结合 WM_RBUTTONDOWN
和 WM_RBUTTONUP
来实现你想要的。 while WM_RBUTTONDOWN
,开始循环做某事,while WM_RBUTTONUP
,停止做。
private static IntPtr ButtonHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
if (wParam == (IntPtr)WM_RBUTTONDOWN)
{
Start();
}
else if (wParam == (IntPtr)WM_RBUTTONUP)
{
Stop();
}
}
return CallNextHookEx(MainWindow._hookId, nCode, wParam, lParam);
}
private static void Satrt()
{
_toStop = false;
while (true)
{
if (_toStop)
{
_toStop = false;
return;
}
DoTask();
}
}
private static void Stop()
{
_toStop = true;
}
private static void DoTask()
{
// do something
}
private static bool _toStop;