2011-05-30 83 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;