让应用程式禁止Windows屏幕保护

2008-02-23 05:36:42来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

假如在您的程式中需要一个很长的时间段来进行大量的数据处理,这段时间长得足以使Windows因检测不到用户动作而激活屏幕保护程式,一旦启动了屏幕保护程式,您的程式运行实际上就变慢了,这会大大影响程式的正常运行。有没有一种方法,使程式在进行长时间的数据处理前关掉屏幕保护呢?答案是肯定的。Windows在启动屏幕保护程式前会向当前激活的应用程式发送WM_SYSCOMMAND消息,其中wParam参数指定了即将执行的系统命令类型,在本例中其值为SC_SCREENSAVE。问题在于程式如何捕获这个消息呢?在C Builder中能够利用TApplication类的OnMessage事件句柄来处理这个消息。应用程式在接收到任何Windows消息后都会触发TApplication类的OnMessage事件,通过定义这个事件的处理程式,能够捕获发送给应用程式的任何Windows消息(这当然不包括在程式中用SendMessage函数发送的消息)。

  OnMessage事件的定义如下:

typedef void__fastcall(__closure *TMessageEvent)(tagMSG &Msg,bool&Handled);
__property TMessageEvent OnMessage={read=FOnMessage,write=FOnMessage};

  其中TMessageEvent类型是OnMessage事件的类型,他定义了处理消息的方法,Msg参数给出了Windows消息的相关信息,其结构如下:

typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}

  Handled参数决定了如何对消息进行下一步处理,假如在接收到一个消息后将Handled参数设为true,则这个消息将不会得到进一步的处理,在本例中就是取消屏幕保护程式的激活。

  启动C Builder,新建一工程文档,在头文档中的Private段增加对成员函数CaptureMessage的声明:

class TForm1 : public TForm
{
__published:
private:
void __fastcall CaptureMessage(tagMSG &Msg,bool &Handled);
public:
__fastcall TForm1(TComponent* Owner);
};

  在.cpp文档中增加CaptureMessage的定义:

void __fastcall TForm1::CaptureMessage(tagMSG &Msg,bool &Handled)
{
if(Msg.message= =WM_SYSCOMMAND && Msg.wParam= =SC_SCREENSAVE)
Handled=true; //阻止屏幕保护的启动
else
Handled=false; //进行该消息的缺省处理
}

  再将定义好的CaptureMessage函数作为OnMessage事件的事件处理器,将以下代码加到主窗体的OnCreate事件处理器中:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage=CaptureMessage;
}

  按F9编译并运行程式,您能够事先将屏幕保护的等待时间设为一个尽可能小的值来检验程式的运行情况。您会发现在程式运行期间,屏幕保护程式将无法被激活,关闭运行的程式后再等待一会儿,屏幕保护程式就会正常出现。以上代码在C Builder3、win98环境中运行通过。




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 拦截Windows消息

下一篇: 在ActiveX控件中检测IE中STOP按钮的按下

热门词条
热门标签