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;
可以直接 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;
这样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.
设置属性KeyPreview = True;
设置了,窗体属性KeyPreview := True 不过还是谢谢kiboisme
我那个实际就是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;
先前那个例子中的ShockwaveFlash是不显示不运作的,它只是把内容复制到TImage中,没法判断它的按键。
除非你正常的显示运行这个ShockwaveFlash来播放flash
设置属性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;
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;
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.
不过还是谢谢kiboisme
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;