在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;
