如何在处理WM_SYSKEYDOWN消息后停止发出蜂鸣声?

时间:2015-07-05 20:00:47

标签: delphi delphi-2009 messages

当我按下Alt + Enter组合键时,我希望我的控件执行某些操作。我通过捕捉WM_SYSKEYDOWN来实现这一目标。但每次都是" syskey"按下组合系统发出哔哔声,我不知道如何阻止它。我试图返回0(Message.Result:=0),清除char代码(Message.CharCode:=0)或不调用继承的方法但没有成功。我发现这个哔哔声不在我的WMSysKeyDown程序中,而是在它之后。

在我的实际操控中,我没有TEdit,但这并不重要,每次控制都会发出哔哔声。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyControl = class(TEdit)
  private
    procedure WMSysKeyDown(var Message: TWMSysKeyDown); message WM_SYSKEYDOWN;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    MyControl:TMyControl;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyControl.WMSysKeyDown(var Message: TWMKey);
begin
 case Message.CharCode of
  VK_RETURN: if (Message.KeyData and $40000000)=0 then begin
    TForm(Parent).Caption:=TForm(Parent).Caption+' x';
    Message.Result:=0;
  end;
 end;
 inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 MyControl:=TMyControl.Create(Form1);
 MyControl.Parent:=Form1;
end;

end.

1 个答案:

答案 0 :(得分:1)

使用PeekMessage功能。 (Winapi功能)。删除队列中的所有消息。我想你会在winapi peekmessage帮助中找到详细的说明。

procedure TMyControl.WMSysKeyDown(var Message: TWMKey);
var
  Mesaj : TMsg ;
begin
 case Message.CharCode of
  VK_RETURN:
    if (Message.KeyData and $40000000)=0 then
    begin
      TForm(Parent).Caption:=TForm(Parent).Caption+' x';
      PeekMessage(Mesaj, Form1.Handle, 0, 0, PM_REMOVE); // Here is the answer. Delete all queued messages in the message queue
    end;
  end;
 inherited;
end;