让应用措施克制Windows屏幕掩护
假如在你的措施中需要一个很长的时间段来举办大量的数据处理惩罚,这段时间长得足以使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情况中运行通过。