C#,如何接收系统关机消息? 有没有方法接收系统的关机信息? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有一个windows API函数发送系统关机消息,C#程序可以监听这个消息,然后阻止windows关机。不记得这个函数了,找找看。 不让关机是吧,看下面的代码: private const int WM_QUERYENDSESSION=0x0011; protected override void WndProc(ref Message m) { switch(m.Msg) { case WM_QUERYENDSESSION: m.Result=(IntPtr)0; break; default: base.WndProc(ref m); break; } } lovevsnet(编程一把手)真是编程一把手 Bliss_qingyang,你说的不对,我很菜的,是一把手编程 假如我需要由程序log.exe在C盘根目录下创建一个文本文件(log.txt)来记录Message,当当前Message为关机的对应消息时,写出记录并退出程序,如何实现?(附:在Form的Load事件和 Closing、Closed事件里面都实现不了) 引用 lovevsnet(编程一把手) ( 的回复private const int WM_QUERYENDSESSION=0x0011; protected override void WndProc(ref Message m) { switch(m.Msg) { case WM_QUERYENDSESSION: //写保存代码 break; default: base.WndProc(ref m); break; } } 你是不是还要处理其它消息?反正用我上面的就行了,为了测试我关了N回机了 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; } }不要告诉我你连那两个API也不会哦好了也写一下吧: [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section,string key,string val,string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section,string key, string def,StringBuilder retVal,int size,string filePath); 如果你要进行别的处理改一下上面的就行了,祝你好运! 我是个新手,对这个问题很感兴趣。请问lovevsnet(编程一把手)WndProc()函数的参数是怎么获得的,问题太简单了,不要笑我。 在你的程序中加上事件:Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(this.OnSessionEnding); private void OnSessionEnding( object sender,Microsoft.Win32.SessionEndingEventArgs e ) { //这里写你的日志文件,如果要取消这次操作(注销或者关闭系统)将e.cancel=true } 一把手:你那个程序需要添加什么引用吗?大康:去哪里找那个Microsoft命名空间。 系统在关机的时候会向每一个程序发送一个WM_QUERYENDSESSION消息,你就处理这个消息就可以了 Assembly: System (in system.dll) using Microsoft.Win32; 原来楼主就要那么简单的功能啊, wuyazhe(我的宝贝叫阿刺) 不是说了,就那么做吧private const int WM_QUERYENDSESSION=0x0011;protected override void WndProc(ref Message m){switch(m.Msg){case WM_QUERYENDSESSION://写保存代码base.WndProc(ref m);break;default:base.WndProc(ref m);break;}} protected override void WndProc(ref Message m)是用在WINFORM下的,WEBFORM没也不要添加什么引用请在VS。NET2003(OR 2005)中手动输入:protected override 按空格后就会有个下拉框让你选择要重写什么事件你选择后自动为你添加了基本的代码,你只要加入你要的代码就行了 to:lovevsnet(编程一把手),如何继续执行系统关机事件呢?我在程序中写了如下代码:protected override void WndProc(ref Message m) { int WM_ENDSESSION = 0x0016; if (m.Msg == WM_ENDSESSION) { if (MessageBox.Show("关闭xxx程序?", "xxx管理程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel) return; else { m.WParam = (IntPtr)0; m.Result = (IntPtr)1; this.Close(); } } base.WndProc(ref m); }当关机时系统弹出了提示,但我点击确定后,程序是关闭了,但系统不继续关闭呢,要再执行一下关机才行,这是怎么回事?我怎么做才能继续关机?谢谢! to:lovevsnet(编程一把手),如何继续执行系统关机事件呢?我在程序中写了如下代码:protected override void WndProc(ref Message m) { int WM_ENDSESSION = 0x0016; if (m.Msg == WM_ENDSESSION) { if (MessageBox.Show("关闭xxx程序?", "xxx管理程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel) return; else { m.WParam = (IntPtr)0; m.Result = (IntPtr)1; this.Close(); } } base.WndProc(ref m); }当关机时系统弹出了提示,但我点击确定后,程序是关闭了,但系统不继续关闭呢,要再执行一下关机才行,这是怎么回事?我怎么做才能继续关机?谢谢! VS2008 C# WM6开发TXT阅读器,关联文件后如何实现多实例(多开)? 如何用.NET技术来对两篇文章进行对平,把相似的段落和文字标出来? 请教C# windows服务问题 关于正则的最短匹配问题 vs2005 一个奇怪的问题 怎样生命动态数组对象? 做应用程序,用DataGird这个控件为什么都是要以树型展开??不能直接用吗? 创建表.SqlHelper”的类型初始值设定项引发异常。 此段代码为什么不能通过编译? string如何转换成single 自已写的日期输入控制,给大家参考一下. 请问在C#中如何触发TIMER事件啊
private const int WM_QUERYENDSESSION=0x0011;
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_QUERYENDSESSION:
m.Result=(IntPtr)0;
break;
default:
base.WndProc(ref m);
break;
}
}
private const int WM_QUERYENDSESSION=0x0011;
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_QUERYENDSESSION:
//写保存代码 break;
default:
base.WndProc(ref m);
break;
}
}
反正用我上面的就行了,为了测试我关了N回机了
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;
}
}不要告诉我你连那两个API也不会哦
好了也写一下吧:
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string
section,string key,string val,string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,string key, string def,StringBuilder retVal,int size,string filePath);
如果你要进行别的处理改一下上面的就行了,祝你好运!
请问lovevsnet(编程一把手)
WndProc()函数的参数是怎么获得的,问题太简单了,不要笑我。
Microsoft.Win32.SystemEvents.SessionEnding +=
new Microsoft.Win32.SessionEndingEventHandler(this.OnSessionEnding); private void OnSessionEnding( object sender,Microsoft.Win32.SessionEndingEventArgs e )
{
//这里写你的日志文件,如果要取消这次操作(注销或者关闭系统)将e.cancel=true
}
大康:去哪里找那个Microsoft命名空间。
private const int WM_QUERYENDSESSION=0x0011;
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_QUERYENDSESSION:
//写保存代码
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}}
是用在WINFORM下的,WEBFORM没
也不要添加什么引用
请在VS。NET2003(OR 2005)中手动输入:protected override
按空格后就会有个下拉框让你选择要重写什么事件
你选择后自动为你添加了基本的代码,你只要加入你要的代码就行了
我在程序中写了如下代码:
protected override void WndProc(ref Message m)
{
int WM_ENDSESSION = 0x0016;
if (m.Msg == WM_ENDSESSION)
{
if (MessageBox.Show("关闭xxx程序?", "xxx管理程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel)
return;
else
{
m.WParam = (IntPtr)0;
m.Result = (IntPtr)1;
this.Close();
}
}
base.WndProc(ref m);
}
当关机时系统弹出了提示,但我点击确定后,程序是关闭了,但系统不继续关闭呢,要再执行一下关机才行,这是怎么回事?我怎么做才能继续关机?
谢谢!
我在程序中写了如下代码:
protected override void WndProc(ref Message m)
{
int WM_ENDSESSION = 0x0016;
if (m.Msg == WM_ENDSESSION)
{
if (MessageBox.Show("关闭xxx程序?", "xxx管理程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel)
return;
else
{
m.WParam = (IntPtr)0;
m.Result = (IntPtr)1;
this.Close();
}
}
base.WndProc(ref m);
}
当关机时系统弹出了提示,但我点击确定后,程序是关闭了,但系统不继续关闭呢,要再执行一下关机才行,这是怎么回事?我怎么做才能继续关机?
谢谢!