在delphi中,很多窗体和控件的鼠标事件里面已经将鼠标按键状态封装好传给响应事件的函数,所以这种情况直接使用就可以,但在某些时候,我们没有这些事件可以处理时,想判断鼠标按键是否按下的状态,就需要借助API或者消息了,使用API和消息可分别应对2种不同情形:
1)使用API: GetAsyncKeyState,适合实时检测,下面代码演示判断鼠标是否按下左键
function IsMouseLButtonDown():Boolean;
begin
Result := (Windows.GetAsyncKeyState(VK_LBUTTON) and $FF00) > 0;
end;
注:GetAsyncKeyState也可以用于检测键盘各种按键的状态,如可以检测CTRL按键、F1按键等是否按下,具体查MSDN;
有时候判断鼠标的时机比较特殊,需要在用户按下鼠标后才去检测,这时候API是没法检测的,因为API是获取当前时刻的状态,用户按下后,鼠标按键已经被放开,这时候使用API去检测,只能检测到没有鼠标按键按下,这种情况下我们需要使用下面消息的方式。
2)使用消息,同样也是delphi代码,不过其他语言都是相通的,毕竟都是使用Windows的资源
在Application的OnMessage事件中处理(如果重载Form的WndProc窗口过程,将无法检测到控件或菜单等的消息)
.....
...
Application.OnMessage := MessageEvent;
.......
....
procedure TForm1.MessageEvent(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_LBUTTONDOWN then
begin
//鼠标左键被按下,其他按键使用其他消息,如 WM_RBUTTONDOWN、WM_MBUTTONDOWN等
end;
end;