在 Windows 10 的 Delphi 11 32 位 VCL 應用程式中,在運行時,我在按住 SHIFT 和 CTRL 修飾鍵的同時右鍵單擊控制元件,將單擊的控制元件的名稱復制到剪貼板:
procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
case Msg.message of
Winapi.Messages.WM_RBUTTONDOWN:
begin
// Detect the name of the clicked control:
var ThisControl: Vcl.Controls.TWinControl;
ThisControl := Vcl.Controls.FindControl(Msg.hwnd);
if Assigned(ThisControl) then
begin
var keys: TKeyboardState;
GetKeyboardState(keys);
// when right-clicking a control, hold down the SHIFT and CTRL key to escape the possible default click behavior of the control:
if (keys[VK_SHIFT] and $80 <> 0) and (keys[VK_CONTROL] and $80 <> 0) then
begin
Handled := True;
//CodeSite.Send('TformMain.ApplicationEvents1Message: ThisControl.Name', ThisControl.Name);
Vcl.Clipbrd.Clipboard.AsText := ThisControl.Name;
end;
end;
end;
end;
end;
這適用于幾乎所有控制元件,除了Timage和TLabel(可能還有一些其他控制元件型別)。我怎樣才能使它與Timageand 一起作業TLabel?
uj5u.com熱心網友回復:
TImage并且TLabel源自TGraphicControl,不是TWinControl。他們沒有HWND自己的,這就是為什么Vcl.Controls.FindControl()對他們不起作用。您正在接收WM_RBUTTONDOWN屬于他們Parent的訊息HWND。在內部,當 VCL 路由訊息時,它將考慮圖形子控制元件。但你的代碼不是。
試試吧Vcl.Controls.FindDragTarget()。它將螢屏坐標作為輸入(您可以通過在WM_RBUTTONDOWN's lParamusingWinapi.ClientToScreen()或 中轉換客戶端坐標來獲得Winapi.MapWindowPoints()),然后回傳TControl這些坐標處的 ,因此它適用于視窗和圖形控制元件。
話雖如此,您不需要Winapi.GetKeyboardState()在這種情況下使用,因為WM_RBUTTONDOWN'swParam告訴您在生成訊息時是否按住了SHIFT和CTRL鍵(請記住,您正在處理排隊的訊息,因此在訊息生成的時間以及您收到訊息的時間)。
procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
const
WantedFlags = MK_SHIFT or MK_CONTROL;
begin
if Msg.message = WM_RBUTTONDOWN then
begin
// Detect the name of the clicked control:
var Pt: TPoint := SmallPointToPoint(TSmallPoint(Msg.LParam));
Windows.ClientToScreen(Msg.hwnd, Pt);
var ThisControl: TControl := FindDragTarget(Pt, True);
if Assigned(ThisControl) then
begin
// when right-clicking a control, hold down the SHIFT and CTRL key to escape the possible default click behavior of the control:
if (Msg.wParam and WantedFlags) = WantedFlags then
begin
Handled := True;
//CodeSite.Send('TformMain.ApplicationEvents1Message: ThisControl.Name', ThisControl.Name);
Clipboard.AsText := ThisControl.Name;
end;
end;
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/357950.html
標籤:德尔福 登录 delphi-11-alexandria
下一篇:泛型覆瓦紋
