我想創建一個 Delphi 應用程式,當用戶將滑鼠移到螢屏左上角時它會做一些有趣的事情。我想了想,打算用下面的策略來做:
創建一個非常小的 3x3 表單并使其透明并始終位于頂部。也使它沒有標題欄或邊框。
為表單定義滑鼠輸入事件。
我在步驟 1 中使用以下代碼:
procedure TopLeftForm.FormCreate(Sender: TObject);
begin
FormStyle := fsStayOnTop;
self.TransparentColor := true;
self.TransparentColorValue := self.Color;
self.BorderStyle := bsNone;
end;
問題是我發現當Form是透明的時候,它不能捕獲滑鼠進入事件。我可以使表單不透明以獲取滑鼠輸入事件,但這樣用戶可以在螢屏左上角看到表單,這不是我想要的。
你對我的問題有什么建議?
uj5u.com熱心網友回復:
您想要的是一個“掛鉤”,它可以為您提供有關滑鼠事件的資訊,而無需為您的程式提供這些事件。這是一個太大的話題,無法一口氣給你一個操作方法,但是這兩個鏈接應該會有所幫助:
了解如何使用 Windows 掛鉤
Delphi 代碼滑鼠鉤教程
為什么要使用 Windows 掛鉤?
Windows 環境是圍繞傳遞的訊息而設計的。通常,程式只對直接發送到它自己視窗的訊息感興趣。嘗試確保您的應用程式有一個可以獲取訊息的視窗會阻止其他應用程式在您位于同一位置時接收這些訊息,并且如果另一個視窗在您的上方,那么您將不會收到訊息。如果您想了解通常不會發送給您的正在發生的活動 - 例如,在應用程式視窗外單擊滑鼠。為了使應用程式能夠看到不屬于自己的事件,可以使用 windows 掛鉤。
根據您要訪問的內容,有不同型別的鉤子。滑鼠鉤適合您在此處指定的內容。系統為所有已安裝的鉤子維護一個“鉤子鏈” - 您有責任將訊息傳遞到鏈中,并從鏈中卸載您自己。
要訪問訊息,您的鉤子函式將如下所示(代碼取自上面的第二個鏈接并進行了修改):
function MouseHookHandler(ACode: Integer; WParam: WParam; LParam: LParam): LResult; stdcall;
var
vMouseInfo: PMouseHookStruct;
begin
if ACode < 0 then
Result := CallNextHookEx(Data^.MouseHook, ACode, WParam, LParam)
else
begin
vMouseInfo := PMouseHookStruct(Pointer(LParam));
PostMessage(Data^.AppHandle, WM_CUSTOM_MOUSE, vMouseInfo^.pt.X, vMouseInfo^.pt.Y);
// we dont want to block the mouse messages
Result := CallNextHookEx(nil, ACode, WParam, LParam);
end;
end;
在你的鉤子函式中:
ACode取決于鉤子的型別并指示事件wParam并lParam具有特定于事件的含義
要傳遞訊息,您應該呼叫CallNextHookEx- 但是對于某些鉤子,無論如何都會傳遞訊息。
鉤子可以作為全域鉤子安裝 - 這意味著它們攔截在與呼叫執行緒相同的桌面/WinStation 中運行的所有執行緒上的訊息。因此,例如,如果您有多個用戶通過 RD 連接,則掛鉤僅特定于其中一個桌面。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/445787.html
