procedure Tfrmcheckin.FormCreate(Sender: TObject);
begin
  Application.OnMessage:=self.AppMessage;
end;
procedure  Tfrmcheckin.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_KEYDOWN then
  begin
    if (Msg.wParam=vk_f1)then
    begin
      butdesk.click ;
      exit;
    end;
end;按下F1就触发butdesk.click 这个事件。怎么能判断,我只在frmcheckin这个窗体出现时按下F1有效,其他窗体出现时按下F1无效

解决方案 »

  1.   

    if Msg.Handle = frmcheckin.Handle then
    ...
      

  2.   

    procedure  Tfrmcheckin.AppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if (Msg.message = WM_KEYDOWN) and (Msg.hwnd = frmcheckin.Handle) then
      begin
        if (Msg.wParam=vk_f1)then
        begin
          butdesk.click ;
          exit;
        end;
    end;我这样试过,但在frmcheckin这个窗体,按下F1不发生任何事件,打开这个窗体后,关上,再开别的窗体,按下F1依然会出错
      

  3.   

    哦,是因为焦点在窗体上的EDIT,所以发出的消息不是frmcheckin.handlw而frmcheckin.edit1.handle,
    怎么判断是不是 frmcheckin上所有控件发出的消息而不是其他窗体上的呢
      

  4.   

    回复人: abc3000(想想就烦) ( ) 信誉:106  2005-10-17 10:26:00  得分: 0  
     
     
       form的keypreview设置为true
      
     
    楼上的办法,好象无效的样子:(