2011-05-30 37 views
1

我正在檢測機器空閒狀態,如果空閒,我執行一個動作。通過代碼取消空閒狀態...

其中一個操作必須取消該狀態,否則將進入循環。
我想在執行它時阻止重新進入空閒循環,我該怎麼做?

+0

我很困惑,(一):是一些其他的應用程序,防止你的機器進入閒置,你想要防止?或(B)你**想要防止機器進入閒置狀態? – Johan 2011-05-30 12:49:54

+0

@Johan:我想他想在他的「OnSystemIdle」處理程序代碼中防止重新進入。 – 2011-05-30 13:08:31

+0

就是這樣。我想要防止再次入侵。 – Jlouro 2011-05-30 13:18:18

回答

0

通過按下一個鍵我想這會做的伎倆

keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); 
    keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0); 

這按下Shift鍵,然後系統會認爲電腦也不閒着任何更多...

+0

-1,現在人們會想知道爲什麼他們的屏保沒有激活,或者爲什麼屏幕從午餐返回時沒有關閉。只需在空閒事件中使用布爾標誌。 – 2011-05-31 10:14:47

5

的一種方式,以防止重入是記住,如果你已經進入了事件處理程序:

type 
    TForm1 = class(TForm) 
    ApplicationEvents1: TApplicationEvents; 
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); 
    private 
    { Private-Deklarationen } 
    FInOnIdle: Boolean; 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); 
begin 
    if FInOnIdle then Exit; 

    FInOnIdle := True; 
    try 
    
    finally 
    FInOnIdle := False; 
    end; 
end;
+0

+1 @海因茲,打敗我19secs – Johan 2011-05-30 13:48:04

+0

@Johan:在我提示問題評論之後,它仍然讓你們兩個人足夠長時間:-)(如果不是下一個星期三的最後期限,我會這麼做的。 ) – 2011-05-30 13:50:41

+0

@Johan,我首先給出了答案,但是你正確地打敗了我的問題:-) – 2011-05-30 13:52:06

1

添加標誌在窗體的增值經銷商,測試,看看你在空閒循環是已:

interface 

type TForm1 = class(TForm) 
... 
private 
... 
    InIdleLoop: boolean; 
... 

implementation 

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); 
begin 
    if InIdleLoop then exit; 
    InIdleLoop:= true 
    try 
    //Do your idle processing here 

    finally 
    InIdleLoop:= false; 
    end; {try} 
end;