日期:2014-05-20  浏览次数:20951 次

◆◆◆如何在关机前对另一个程序进行操作◆◆◆
我现在采用的方法是(.net   2005):
在自己程序A里重写   WndProc(ref   Message   m)   函数
拦截关机的   WM_QUERYENDSESSION   消息
接下来执行一段代码对另一个程序B进行操作(只是在该程序的某个按钮上模拟了鼠标点击操作而已)

遇到的问题是:在执行到这段代码时,发现另一个程序B已经被windows关闭了!
想重新执行它却被告知“窗口站已关闭”,执行失败。

估计可行的解决方法是:
1、让自己的程序A   抢在B被关闭前   拦截WM_QUERYENDSESSION消息。
2、设置全局钩子,钩住ExitWindowsEx函数。

哪位高人可以告诉我具体解决的方法呢?
感激不尽!




------解决方案--------------------
使用系统定义好的类,用如下三个事件就可以了,

SystemEvents.SessionEnded;
SystemEvents.SessionEnding;
SystemEvents.SessionSwitch;

------解决方案--------------------
应该在B中拦截,即不让系统自动关闭B
private const int WM_QUERYENDSESSION=0x0011;
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_QUERYENDSESSION:
StringBuilder sb=new StringBuilder(512);
GetPrivateProfileString( "Option ", "不允许关机 ", "Yes ",sb,sb.Capacity, "c:\\1.ini ");
if(sb.ToString()== "Yes ")
{
m.Result=(IntPtr)0;
}
else
{
WritePrivateProfileString( "Option ", "关机时间 ",DateTime.Now.ToString(), "c:\\log.ini ");
base.WndProc(ref m);
}

//WritePrivateProfileString( "Option ", "不允许关机 ", "Yes ", "c:\\log.ini ");
//GetPrivateProfileString( "Option ", "不允许关机 ", "Yes ", "c:\\log.ini ");
break;
default:
base.WndProc(ref m);
break;
}

}


------解决方案--------------------
参考,
http://blog.csdn.net/zhzuo/archive/2005/04/14/347712.aspx