如何判断在ShockwaveFlash控件上,判断到键盘字母A一直是按下状态,或者松开也可以马上知道.要去研究消息 勾子函数吗?sololie 哥再看看.上个也结贴了!又是100分

解决方案 »

  1.   

    我来了.座等,Sololie哥辛苦了
      

  2.   

    你是想在先前那个ShockwaveFlash模拟透明flash播放的例子中要判断键盘按键吗?
    先前那个例子中的ShockwaveFlash是不显示不运作的,它只是把内容复制到TImage中,没法判断它的按键。
    除非你正常的显示运行这个ShockwaveFlash来播放flash
      

  3.   

    也可以不是这ShockwaveFlash  控制上,只要在这个窗体上用任何的方式能判断到就可以,A是按住状态,showmessage('按住状态');就可以了.
      

  4.   

    ShockwaveFlash,所在Form
    设置属性KeyPreview = True;
    然后在Form.OnKeyDown以及Form.OnKeyUp中判断是否是A键即可
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (Key = Ord('A')) and (Self.ActiveControl<>NIL) and (Self.ActiveControl is TShockwaveFlash) then
        Caption := 'A Down'
    end;procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (Key = Ord('A')) and (Self.ActiveControl<>NIL) and (Self.ActiveControl is TShockwaveFlash) then
        Caption := 'A Up'
    end;
      

  5.   

    可以直接
    type
      TForm1 = class(TForm)
        shckwvflsh1: TShockwaveFlash;
        btn1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        OldWndProc: TWndMethod; 
        procedure NewWndProc(var msg: TMessage);
      end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldWndProc := shckwvflsh1.WindowProc;
      shckwvflsh1.WindowProc := NewWndProc;
      shckwvflsh1.Movie := 'c:\1.swf';
      shckwvflsh1.Play;
    end;procedure TForm1.NewWndProc(var msg: TMessage);
    begin
      if msg.Msg = WM_KEYDOWN then
      begin
        // 这里做处理
      end;
       OldWndProc(msg);
    end;
      

  6.   

    这样unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, ExtCtrls;type
      TForm1 = class(TForm)
        shckwvflsh1: TShockwaveFlash;
        tmr1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure tmr1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        OldWndProc: TWndMethod;
        procedure NewWndProc(var msg: TMessage);
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      isKeyDown: ShortInt;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldWndProc := shckwvflsh1.WindowProc;
      shckwvflsh1.WindowProc := NewWndProc;
      shckwvflsh1.Movie := 'c:\1.swf';
      shckwvflsh1.Play;end;procedure TForm1.NewWndProc(var msg: TMessage);
    begin
      if (msg.Msg = WM_KEYDOWN) and ((msg.WParam = Ord('A'))) then
        isKeyDown := 1;
      if (msg.Msg = WM_KEYUP) and (msg.WParam = Ord('A')) then
        isKeyDown := 2;
      OldWndProc(msg);
    end;procedure TForm1.tmr1Timer(Sender: TObject);
    begin
      if isKeyDown = 1 then
        Caption := '按住了A键';
      if isKeyDown = 2 then
        Caption := '松开了A键';
    end;end.
      

  7.   

    设置属性KeyPreview = True;
      

  8.   

    设置了,窗体属性KeyPreview := True 
    不过还是谢谢kiboisme 
      

  9.   

    我那个实际就是TShockwaveFlash包装好的子类化功能......
     OldWndProc := shckwvflsh1.WindowProc; // 保存当前的窗口过程
     shckwvflsh1.WindowProc := NewWndProc; // 设置新的窗口过程
    ......
    procedure TForm1.NewWndProc(var msg: TMessage);
    begin
      if (msg.Msg = WM_KEYDOWN) and ((msg.WParam = Ord('A'))) then
        isKeyDown := 1;
      if (msg.Msg = WM_KEYUP) and (msg.WParam = Ord('A')) then
        isKeyDown := 2;
      OldWndProc(msg); // 恢复原窗口过程
    end;
      

  10.   

    Sololie哥给的东西,完全解决了,这世界有你,才如此美好.结贴了.Sololie哥,加关注啊,以后我私信你啊.哈哈..要不然私信不了.我相信,我还有没完没了的问题.当然.100分一问,那都是基本保障.哈哈...
      

  11.   

    http://bbs.csdn.net/topics/390459184 sololie 哥,结合以前那个透明的例子,没反应,是什么原因啊,座等