unit NoActionResponse;
interface
uses
Vcl.ExtCtrls, System.Classes, Winapi.Windows, Winapi.Messages, Vcl.Forms, Vcl.Dialogs;
type
// 鍵盤,滑鼠規定時間內無動作回應時,觸發事件
TNoActionResponse = class(TTimer)
private
FOnTimer: TNotifyEvent;
FNum: Integer;
protected
procedure Timer; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure AppMessageHandler(var Msg: TMsg; var Handled: Boolean);
published
// 所有的事件都屬性的一種,靠windows發訊息來執行,而所有的事件名稱都是訊息定義好的,或者自己定義訊息也觸發相應的事件
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
// 運行幾次時間后,觸發
property Num: Integer read FNum write FNum default 1;
end;
procedure Register;
implementation
procedure TNoActionResponse.AppMessageHandler(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = WM_MOUSEMOVE) or (Msg.message = WM_KEYDOWN) then
begin
// 關了重新打開,再次計時,這個寫法不太好,有沒有更好的方法
Enabled := False;
Enabled := True;
end;
end;
constructor TNoActionResponse.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Application.OnMessage := AppMessageHandler;
end;
destructor TNoActionResponse.Destroy;
begin
inherited;
end;
procedure TNoActionResponse.Timer;
begin
FNum := FNum - 1;
if (Assigned(FOnTimer)) and (FNum = 0) then
FOnTimer(Self);
end;
procedure Register;
begin
RegisterComponents('test', [TNoActionResponse]);
end;
end.
這是沒事突然想寫一個小組件,好多年沒寫了,都忘記差不多了!
需求是寫一個時間控制元件,在規定時間內鍵盤,滑鼠沒有任何回應或者沒有動靜,就觸發事件。比如看播放器,在3稱內鍵盤,滑鼠沒有動靜,就自動隱藏按鈕什么的。
上面的組件我寫完后,安裝測驗后沒反應,我想肯定是那里寫錯了。所以請教一下各位看官
uj5u.com熱心網友回復:
用win API GetLastInputInfo我是這樣用的:
function IsKMActionByInterval(const SpaceTime:Integer):Boolean;
var
aLastInputInfo:TLastInputInfo;
begin
Result:=False;
aLastInputInfo.cbSize:=SizeOf(aLastInputInfo);
if GetLastInputInfo(aLastInputInfo) then
begin
if GetTickCount - aLastInputInfo.dwTime > SpaceTime then
Result:=True;
end;
end;
uj5u.com熱心網友回復:
明白你的意思,但我只是想學一下這個組件的事件是如何撰寫的,好久沒寫了,想學習一下
uj5u.com熱心網友回復:
發布的OnTimer事件試圖覆寫父類的同名事件,但這是無效的,只能發布一個新事件。從TTimer繼承主要是為了重用計時器的觸發事件,在觸發時再計次,但僅覆寫Timer無法觸發。在類中創建一個私有程序,把OnTimer指向這個程序,在其中再寫計次的代碼。也可以不從TTimer繼承,而從TComponent開始,但是類中仍然用計時器組件。有不少后者的用法。計次恢復的問題可以用一個臨時整數變數保存傳入的次數,計次結束時再賦值給FNum,恢復初始狀態。uj5u.com熱心網友回復:
TTimer作為私有成員,動態生成它,設定ontimer事件處理函式。每次動滑鼠或鍵盤,都Reset TTimer(即enable:= false; Enable := true;)
uj5u.com熱心網友回復:
是不是可以用Application.OnIdle事件去處理http://bbs.csdn.net/topics/370015169
uj5u.com熱心網友回復:
GetTickCount 與 GetLastInputInfo兩個函式配合使用,可以得到鍵盤、滑鼠處于空閑狀態的時間http://bbs.csdn.net/topics/90372816
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56561.html
標籤:VCL組件開發及應用
