【问题标题】:Ctrl key presses when moving remote access window移动远程访问窗口时按下 Ctrl 键
【发布时间】:2020-10-05 17:55:14
【问题描述】:

我有以下问题:我有一个应用程序,其中 Ctrl 键激活 应用程序事件,并且一些用户使用 RDP(远程访问)来使用该应用程序, 问题是每次触发 Ctrl 键 用户移动 RDP 窗口或应用程序开关并返回 RDP 的时间。

例如:

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_CONTROL) then
    ShowMessage('Ctrl Pressed');
end;

我能够看到应用程序检测到 WM_KEYUP 消息并对其进行处理, 最终触发 OnKeyUp 事件 带参数17(Ctrl),模拟Ctrl键被按下。

我想知道是否有人知道这种行为是否是 Delphi / RDP 中的错误,如果 它有任何可能的解决方案。

我正在使用 Delphi 10 西雅图

【问题讨论】:

  • 转载(Delphi 10.4.1。Windows 10 2004)。非常奇怪的行为。
  • 这真的很奇怪,我从来没有这样奇怪的行为。我通过 RDP 协议使用 Remmina 从 Linux 桌面到​​我的开发 Windows 10 进行了测试,每次焦点进入远程机器时我也会得到 KEY_UP,但在我的测试中我总是得到 VK_TAB。

标签: delphi rdp


【解决方案1】:

看起来 Windows 会发送按键来清除修饰键状态。一种解决方案是确保在采取行动之前先下跌。

仍然 CTRL 也用于切换桌面(除其他外),并且 CTRL-Win+Arrow 将在切换桌面时触发对话框,因此可能需要添加更多保护代码。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
    CtrlDown : boolean;
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_CONTROL) then CtrlDown := true;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_CONTROL) and CtrlDown then
  begin
    ShowMessage('Ctrl Pressed');
    CtrlDown := false;
  end;
end;

end.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多