各位高手:
创建一个Form,上面只有一个Label控件,写下的这个函数是可以接收到用户在Form上按下“a”这个事件的:
    
    if(Message.Msg == WM_KEYDOWN)
    {
        long t = Message.WParam;
        AnsiString str1;
        str1.sprintf("%d",t);
        Label1->Caption = str1;
    }
    TForm::WndProc(Message);
我再在Form上面放置了一个Edit控件,这时这个函数就无法接收到用户按下“a”的事件了,
请问该如何解决?
注:在实际的应用中,我是希望为这个Form创建一个快捷键“q”,按下他可以关闭窗口。
这个窗口上有很多控件。
这个程序要求在同一台pc上运行多个且互不干扰。

解决方案 »

  1.   

    因为label不是窗口,不能获得焦点,所以焦点在你的form上。关注........
      

  2.   

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)不是可以支持热键操作吗?
    可能没有理解楼主的意思!
    关注!
      

  3.   

    procedure WndProc(var Message: TMessage); virtual;
    它是虚函数,所以你的EDIT控件ovrride它了,你把EDIT放在FORM上,现在焦点不在FORM上就会执行EDIT的
    WndProc.
    在EDIT的KEYDOWN里写下
    SendMessage(Handle,WM_KEYDOWN,key,0);
      

  4.   

    窗体的KeyPreview设置为True看看
      

  5.   

    如果要简单的话,先把Form1的KeyPreview属性置为true;然后procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
        if key='a' then Label1.Caption:='a';
    end;如果非要按你的麻烦的做法用ApplicationEvents捕捉的话,那就这样写了
    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
        if (msg.wParam=65) and (msg.message=256) then Label1.Caption:=Label1.Caption+'a';
    end;
      

  6.   

    窗体的KeyPreview设置为True看看
      

  7.   

    这个问题我也碰到过,就是因为edit获得了焦点.把他disabled掉就好了
      

  8.   

    回复人: abc3000() ( ) 信誉:100  2005-9-15 13:27:24  得分: 0  
     
     
       
    这个问题我也碰到过,就是因为edit获得了焦点.把他disabled掉就好了  再放个BUTTON上去看看,你不能都disabled啊
      

  9.   

    那要看你干什么啊,我就做过一个,全部disabled掉,然后对form操作完后按回车,一切都边正常
      

  10.   

    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm2 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure onAppMsg(var Msg: TMsg; var Handled: Boolean);
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.FormCreate(Sender: TObject);
    begin
     Application.OnMessage:=onAppMsg;
    end;
    procedure TForm2.onAppMsg(var Msg: TMsg; var Handled: Boolean);
    begin
         if (Msg.message=WM_KEYDOWN) and (Msg.wParam=ord('B')) then
         begin
            close; //按下B即可关闭该窗口
         end;
    end;
    end.