【问题标题】:Disable Copy/Paste options on default TextEdit Popup in Delphi desktop app在 Delphi 桌面应用程序中的默认 TextEdit 弹出窗口上禁用复制/粘贴选项
【发布时间】:2019-12-02 20:48:45
【问题描述】:

我的应用程序在 VirtualUI 下运行。因为它创建了一个远程会话,所以剪贴板值有时存储在服务器的剪贴板中,而其他时间存储在客户端的剪贴板中存在问题。

行为取决于用户复制/粘贴的方式: - Ctrl+C/V 有效,因为 VirtualUI 能够捕获键盘事件,但是; - 右键单击​​ + 复制/粘贴不起作用,环境无法正确捕获事件并且值存储在错误的剪贴板中,导致在某些情况下复制不同的值并粘贴不同的值(如果用户使用正确的 clisc + Copy 然后Ctrl + V - 或其他方式)

有没有办法在 TEdit 右键单击​​的默认弹出菜单上禁用或隐藏复制和粘贴项目?

到目前为止,我们已经联系了 VirtualUI 开发人员,他们确认问题存在,但他们无能为力。这就是我们想出在所有控件的默认弹出菜单上隐藏复制/粘贴项目的想法的地方。

目前还没有代码,因为我们甚至不知道它是否可能

所需的解决方案是默认的 TEdit(或任何其他控件)弹出菜单,没有复制和粘贴项目。

【问题讨论】:

  • 用于 api 编辑控件的 VCL 包装器,因此没有特定于 Delphi 的内容。对于 api 级别的解决方案,请参阅:stackoverflow.com/questions/32991402/…
  • 更简单的方法是将空弹出窗口附加到控件。那么剩下的唯一用途就是通过键盘了,这至少是一致的。
  • VirtualUI 开发人员声称他们无能为力的说法是错误的。许多类似的程序使用各种方法将客户端和服务器剪贴板的内容保存在 snyc 中。最流行的是在客户端和服务器端跟踪剪贴板内容的变化,然后更新另一个以使其内容匹配。

标签: delphi popup popupmenu


【解决方案1】:

目前我发现的最佳解决方案是创建一个继承自 TEdit 的新类,并在 DefaultMessage 过程中过滤“WM_COPY”和“WM_CUT”消息:

type
  TMyEdit = class(TEdit)
    public
      procedure DefaultHandler(var Message); override;
  end;

procedure TMyEdit.DefaultHandler(var Message);
begin
  case TMessage(Message).Msg of
    WM_COPY, WM_CUT: begin
      // insert code here
    end;
    else inherited DefaultHandler(Message);
  end;
end;

这样复制/粘贴项目不会从弹出菜单中消失,但它们不再做任何事情。如果您想将此通知用户,您可以插入您自己的代码。

我还在这里找到了一个有助于更轻松地更改 TEdit 的 ClassType 的过程。只需在 OnCreate 中调用该过程就可以了:

procedure EditToMyEdit(edt: TEdit);
type
  PClass = ^TClass;
begin
  if Assigned(edt) then
    PClass(edt)^ := TMyEdit;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  EditToMyEdit( Edit1 );
end;

希望我能帮上忙。

【讨论】:

  • 我认为他反过来说:禁用弹出窗口而不是 ctrl-c/v 功能
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多