我們知道,可以設定,當在一定的時間內沒有對計算機進行任何操作時,啟動屏幕保護程序。我們還可以規劃計劃任務,讓電腦在某個設定的時間起動我們想進行的工作。這兩個功能都是不錯的構思,所以微軟把它們一直保留了下來。不過,我們可能有更好的想法,希望能在電腦閒置一段時間後進行我們想做的工作,而不僅僅是啟動屏幕保護程序。我們可以暫且稱它為異類的屏幕保護。可是,我們怎麼實現呢?
不會很難吧?對於我們學會編程的人來說,稍稍動動腦筋就行了。難道不是嗎?
我一開始也是這樣想的。不過,當我真的動手時,發現有一個為難的地方:我們怎樣判斷電腦是閒置的呢?
不過這不要緊,我想。我們可以把啟動的屏幕保護程序指向我們需要的任務嘛。不過,我想還有更好的方法。
這個方法我找到了,而且代碼也很簡潔。我想把我的心得發表出來,與大家共享。
如果我們做過鉤子,不論是鍵盤鉤子、鼠標鉤子,或者是其它的系統鉤子,一定還記得SetWindowsHookEx這個函數吧?我統計了一下,在《電腦愛好者》的程序谷中,這個函數也是頻繁的出現。
不多說啦,今天的程序的核心就是SetWindowsHookEx這個函數了,沒有其它要說明的地方。我原來想對程序添加注釋,不過你看看程序吧,真的沒有必要啊,所以就不多說什麼了。哈哈!
程序在Delphi6.0+Windows ME下編程通過。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,SHELLAPI;
type
TForm1 = class(TForm)
Label1: TLabel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hHook: integer;
TimeTotal: integer;
bNotRunning:boolean;
implementation
{$R *.DFM}
const
Timescount = 10;
function JournalRecordProc(iCode: integer; wParam: wParam; lParam: lParam): LResult; stdcall;
begin
TimeTotal := 0;
Result := 0;
end;
function StartHook: Boolean;
begin
Result := False;
if hHook = 0 then
begin
hHook := SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, HInstance, 0);
if hHook > 0 then Result := True;
end;
end;
procedure StopHook;
begin
if hHOok > 0 then
begin
UnHookWindowsHookEx(hHook);
hHook := 0;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hHook := 0;
bNotRunning:=True;
StartHook;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(TimeTotal);
label1.Caption := floattostr(TimeTotal);
if (TimeTotal > Timescount) and bNotRunning then
begin
bNotRunning:=False;
ShellExecute(Handle, 'open', PChar('notepad'),
nil, nil, SW_SHOW);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
stophook;
end;