【发布时间】:2014-06-19 18:46:54
【问题描述】:
我有一个经常被问到的有趣问题,但我发现他们提供的解决方案不起作用......
我在 Win 7 上使用 Delphi XE3。
我一直明白,在 FormKeyDown 或 FormKeyPress 中,您可以将 Key 设置为 0 或 #0 以表示该键已被处理(因此它不应该为无效的按键发出“叮”的声音)。
我做了以下事情:
- 新的 VCL 应用程序
- Form KeyPreview:=true
- 添加一些事件处理程序(见下文)
- 运行
- Alt+T (发出叮声)
我成功检测到 Alt+T 并将 Key 设置为 0。Form OnKeyPress 和 Form OnKeyUp 不会触发。这对我来说并不奇怪,因为我将 Key 设置为 0。
令人惊讶的是,在 OnKeyDown 完成后它仍然发出“叮”的声音。
我怎样才能阻止它这样做?
在某些调试中,似乎是一条消息 WM_SYSKEYDOWN 导致了这种情况发生。
谢谢!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=ord('T')) and (shift=[ssAlt]) then
key:=0;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
showmessage('keypress');
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
showmessage('keyup');
end;
end.
object Form1: TForm1
Left = 267
Top = 163
Caption = 'Form1'
ClientHeight = 565
ClientWidth = 654
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
KeyPreview = True
OldCreateOrder = False
Position = poScreenCenter
ShowHint = True
OnKeyDown = FormKeyDown
OnKeyPress = FormKeyPress
OnKeyUp = FormKeyUp
PixelsPerInch = 96
TextHeight = 13
end
【问题讨论】:
-
您是否尝试过简单地捕获
WM_SYKEY...消息?WM_KEY...和WM_SYSKEY...是不同的消息集。您正在使用的事件处理程序是针对WM_KEY...消息触发的,而不是WM_SYSKEY...消息。 -
如果您的应用没有附加到 alt+t 的加速器,它应该 ding
-
删除了我的回答;它不能正常工作!
标签: delphi