如何判断在ShockwaveFlash控件上字母A一直是按下状态

cuiba1105 2013-05-14 12:06:00
如何判断在ShockwaveFlash控件上,判断到键盘字母A一直是按下状态,或者松开也可以马上知道.要去研究消息 勾子函数吗?sololie 哥再看看.上个也结贴了!又是100分
...全文
148 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cuiba1105 2013-05-15
http://bbs.csdn.net/topics/390459184  sololie 哥,结合以前那个透明的例子,没反应,是什么原因啊,座等
回复
sololie 2013-05-14
素准备碎嚼
回复
sololie 2013-05-14
主板碎嚼,明天再看了
回复
清风皎月 2013-05-14
回复
cuiba1105 2013-05-14
我来了.座等,Sololie哥辛苦了
回复
cuiba1105 2013-05-14
Sololie哥给的东西,完全解决了,这世界有你,才如此美好.结贴了.Sololie哥,加关注啊,以后我私信你啊.哈哈..要不然私信不了.我相信,我还有没完没了的问题.当然.100分一问,那都是基本保障.哈哈...
回复
sololie 2013-05-14
我那个实际就是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;
回复
cuiba1105 2013-05-14
引用 13 楼 kiboisme 的回复:
设置属性KeyPreview = True;
设置了,窗体属性KeyPreview := True  不过还是谢谢kiboisme
回复
蓝色光芒 2013-05-14
设置属性KeyPreview = True;
回复
sololie 2013-05-14
这样

unit Unit1;

interface

uses
  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.

回复
cuiba1105 2013-05-14
理解了,没看全,但是怎么做判断呢.菜的很,不要骂人哈 哈哈..
回复
cuiba1105 2013-05-14
引用 8 楼 sololie 的回复:
可以直接


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;

能不能做个例子,有点看不明白
回复
cuiba1105 2013-05-14
引用 7 楼 kiboisme 的回复:
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)  then
    Caption := 'A Down'
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = Ord('A')) and (Self.ActiveControl<>NIL)  then
    Caption := 'A Up'
end;
原代码执行没有用,新建一个新窗体,去掉后面的控件条件,也是没有用,如何判断一直为按下状态,不行 测试这个代码,并没有用啊
回复
sololie 2013-05-14
可以直接


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;

回复
蓝色光芒 2013-05-14
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;
回复
cuiba1105 2013-05-14
也可以不是这ShockwaveFlash  控制上,只要在这个窗体上用任何的方式能判断到就可以,A是按住状态,showmessage('按住状态');就可以了.
回复
sololie 2013-05-14
你是想在先前那个ShockwaveFlash模拟透明flash播放的例子中要判断键盘按键吗? 先前那个例子中的ShockwaveFlash是不显示不运作的,它只是把内容复制到TImage中,没法判断它的按键。 除非你正常的显示运行这个ShockwaveFlash来播放flash
回复
相关推荐
发帖
Delphi
创建于2007-08-02

4923

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2013-05-14 12:06
社区公告
暂无公告