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


  假如在你的程序中需求一个很长的 工夫段来进行大量的数据 解决,这段 工夫长得足以使Windows因检测不到消费者动作而激活屏幕 掩护程序,一旦启动了屏幕 掩护程序,你的程序运行实际上就变慢了,这会大大影响程序的 畸形运行 。有没有一种 步骤,使程序在进行长期的数据 解决前关掉屏幕 掩护呢?答案是 确定的 。Windows在启动屏幕 掩护程序前会向目前激活的 利用程序发送WM_SYSCOMMAND 信息,其中wParam参数指定了马上执行的系统命令类型,在本例中其值为SC_SCREENSAVE 。问题在于程序如何 拿获这个 信息呢?在C++ Builder中 可以利用TApplication类的OnMessage事件句柄来 解决这个 信息 。 利用程序在 接纳到任何Windows 信息后都会触发TApplication类的OnMessage事件,通过定义这个事件的 解决程序, 可以 拿获发送给 利用程序的全部Windows 信息(这固然不包含在程序中用SendMessage函数发送的 信息) 。

  OnMessage事件的定义如下:

  typedef void__fastcall(__closure

  *TMessageEvent)(tagMSG amp;Msg,boolamp;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 amp;Msg,bool amp;Handled);

  public:

  __fastcall TForm1(TComponent* Owner);

  };

  在.cpp文件中添加CaptureMessage的定义:

  void __fastcall TForm1::CaptureMessage(tagMSG amp;Msg,bool amp;Handled)

  {

  if(Msg.message= =WM_SYSCOMMAND amp;amp; Msg.wParam= =SC_SCREENSAVE)

  Handled=true; //阻挠屏幕 掩护的启动

  else

  Handled=false; //进行该 信息的缺省 解决

  }

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

  void __fastcall TForm1::FormCreate(TObject *Sender)

  {

  Application-gt;OnMessage=CaptureMessage;

  }

  按F9编译并运行程序,你 可以事先将屏幕 掩护的期待 工夫设为一个尽可能小的值来 测验程序的运行状况 。你会发现在程序运行期间,屏幕 掩护程序将 无奈被激活,关闭运行的程序后再期待一会儿,屏幕 掩护程序就会 畸形浮现 。以上代码在C++ Builder3、win98环境中运行通过 。

  发送给 利用程序的全部Windows 信息(这固然不包含在程序中用SendMessage函数发送的 信息) 。

  OnMessage事件的定义如下:

  typedef void__fastcall(__closure

  *TMessageEvent)(tagMSG amp;Msg,boolamp;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 amp;Msg,bool amp;Handled);

  public:

  __fastcall TForm1(TComponent* Owner);

  };

  在.cpp文件中添加CaptureMessage的定义:

  void __fastcall TForm1::CaptureMessage(tagMSG amp;Msg,bool amp;Handled)

  {

  if(Msg.message= =WM_SYSCOMMAND amp;amp; Msg.wParam= =SC_SCREENSAVE)

  Handled=true; //阻挠屏幕 掩护的启动

  else

  Handled=false; //进行该 信息的缺省 解决

  }

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

  void __fastcall TForm1::FormCreate(TObject *Sender)

  {

  Application-gt;OnMessage=CaptureMessage;

  }

  按F9编译并运行程序,你 可以事先将屏幕 掩护的期待 工夫设为一个尽可能小的值来 测验程序的运行状况 。你会发现在程序运行期间,屏幕 掩护程序将 无奈被激活,关闭运行的程序后再期待一会儿,屏幕 掩护程序就会 畸形浮现 。以上代码在C++ Builder3、win98环境中运行通过 。