【问题标题】:Detect if Mouse button already pressed before form shows在表单显示之前检测鼠标按钮是否已经按下
【发布时间】:2012-03-13 20:48:43
【问题描述】:

如果按下鼠标按钮并显示一个窗口,则该窗口将在释放鼠标按钮时接收 MouseUp 事件。

是否有可能在显示窗口后检测鼠标按钮是否已被按下?

【问题讨论】:

  • 你可能想看看 GetAsyncKeyState(VK_LBUTTON)
  • 请注意,GetAsyncKeyState 返回物理鼠标按钮状态,而 GetKeyState 返回逻辑状态(关于您在鼠标设置中的 Switch primary and secondary buttons 选项中设置了什么)。

标签: windows delphi winapi delphi-7


【解决方案1】:

我会试试这个:

procedure TForm1.FormShow(Sender: TObject);
begin
  if GetKeyState(VK_LBUTTON) and $8000 <> 0 then
    ShowMessage('Left mouse button is pressed...')
  else
    ShowMessage('Left mouse button is not pressed...')
end;

【讨论】:

  • 谢谢,这是正确的......几乎。 GetKeyState 的结果需要与 $8000 进行比较(参见stackoverflow.com/a/3422706/41338),以检查是否设置了正确的位。
  • 你绝对是对的。谢谢!我会更新帖子。抱歉误导。
【解决方案2】:

要直接回答您的问题,您可以使用GetKeyStateGetAsyncKeyState 测试鼠标按钮状态。您需要的虚拟键码是VK_LBUTTON

它们之间的区别在于GetKeyState 报告当前活动的排队消息发布到您的队列时的状态。另一方面,GetAsynchKeyState 会在您调用GetAsynchKeyState 时为您提供状态。

来自GetKeyState的文档:

当线程从其消息队列中读取关键消息时,此函数返回的关键状态会发生变化。该状态不反映与硬件相关的中断级状态。使用 GetAsyncKeyState 函数检索该信息。 应用程序调用 GetKeyState 以响应键盘输入消息。此函数在生成输入消息时检索键的状态。

我怀疑您应该使用 GetKeyState,但我不能 100% 确定,因为我实际上不知道您想通过这些信息达到什么目的。

【讨论】:

  • 感谢您对这两个函数之间的区别的有用解释。你是对的,GetKeyState 是我需要的。关于我为什么需要这个的额外信息是我正在创建一个表单,其输出基于最后一次释放的鼠标按钮。最初我在按下鼠标按钮时计算它们并将它们计算为释放但有时可能在显示表单之前按下鼠标按钮之一。然而,这个命令意味着我现在可以检查每个 mouseup 事件是否还有其他鼠标按钮被按下。
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多