c# winform中怎么截获处理windows关闭的消息 C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# winform中怎么截获处理windows关闭的消息 C#相关的知识,希望对你有一定的参考价值。

参考技术A 平民百姓说得没错,很久以前我也回答了一位CSDN上的朋友同样的问题,以下是阻止关机的代码:
private
const
int
WM_QUERYENDSESSION=0x0011;
protected
override
void
WndProc(ref
Message
m)

int
i=0;
switch(m.Msg)

case
WM_QUERYENDSESSION:
m.Result=(IntPtr)i;
break;
default:
base.WndProc(ref
m);
break;


---------------------------------
当然你关了电源就没办法阻止了,不过还是可以在关机前保存数据的(在case
WM_QUERYENDSESSION:处添加代码就行了)
参考技术B Form
针对关闭有两个事件:
1、Closing
:在关闭窗体时发生。
2、Closed

关闭窗体后发生。
lz可以看看msdn,上面有详细解释。
参考技术C 我的意思是,程序没有关闭,但windows要关闭,类似work抓到windows关闭的消息,提示是否要保存那样的操作,正在试验hbxtlhx(平民百姓)
和tuyile006(小y)
的方法
参考技术D TO:GXY2005(晓晨美眉好^_^)
(
)
信誉:91
Blog
---------------
要想阻止windows关闭,只能使用API?
这句话不对吧...
第5个回答  2019-12-05 hbxtlhx(平民百姓)
和tuyile006(小y)
的方法都对!
但你并不能阻止windows
关闭

c# 如何截获windows关机或注销消息

要求关机或注销时弹出一个确认框提示我是否继续,
选择是继续关机,选择否取消关机回到windows.
可是为什么这种方法在我的电脑上不行啊,关机和注销的时候还是和平常一样,我的系统是winxpsp2.
是不是系统设置的问题啊?还有其他方法吗?

Form里有WndProc方法,对它进行重写,可以捕获系统消息。下面的代码放进你程序里试试。
//截取消息,进行处理
protected override void WndProc(ref Message m)

switch(m.Msg)

case 17:
MessageBox.Show("哈哈,你不能关闭计算机!");
m.Result=(IntPtr)0;
break;
case 513:
MessageBox.Show("哈哈,你不能点击左键!");
m.Result=(IntPtr)0;
break;
case 516:
MessageBox.Show("哈哈,你不能点击右键!");
m.Result=(IntPtr)0;
break;
default:
base.WndProc(ref m);
break;


以上方法是截获系统关机时发送给各个进程的关机消息,如果这种方法没用的话,可以用windows系统钩子来进行消息获取,一旦设置了系统钩子,它将先于任何消息捕捉机制而第一个捕捉到消息,用到系统钩子必须从系统DLL导入以下方法。
//装置钩子的函数
[DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
//卸下钩子的函数
[DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);

//下一个钩挂的函数
[DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
具体的用法,可以去网上搜索,网上有很多的。英文叫windows hook。
参考技术A protected override void OnFormClosing(FormClosingEventArgs e)

switch (e.CloseReason)

case CloseReason.ApplicationExitCall:
e.Cancel = true;
MessageBox.Show("拦截关闭要求事件!");
break;
case CloseReason.FormOwnerClosing:
e.Cancel = true;
MessageBox.Show("拦截自身关闭事件!");
break;
case CloseReason.MdiFormClosing:
e.Cancel = true;
MessageBox.Show("拦截MDI窗体关闭事件!");
break;
case CloseReason.None:
break;
case CloseReason.TaskManagerClosing:
e.Cancel = true;
MessageBox.Show("拦截任务管理器关闭事件!");
break;
case CloseReason.UserClosing:
e.Cancel = true;
MessageBox.Show("拦截用户关闭事件!");
break;
case CloseReason.WindowsShutDown:
e.Cancel = true;
MessageBox.Show("拦截关机事件!");
break;
default:
break;


base.OnFormClosing(e);


但是值得一提的时候,关闭和注销的时候有时候会弹出来程序没响应的提示,这时候如果用立刻结束,还是会被关掉的。本回答被提问者采纳
参考技术B 楼上的朋友,楼主的意思是拦截windows的关机消息,不是关机以后发送给各进程的关机消息。

我猜用C#应该是实现不了的,看用远程注射能不能搞定了。可能通过替换掉内存中的关机的那段代码可以搞定。不过我也没什么经验,希望大家不要笑我。

以上是关于c# winform中怎么截获处理windows关闭的消息 C#的主要内容,如果未能解决你的问题,请参考以下文章

c# 如何截获windows关机或注销消息

C# WinForm中截获Console输出

C# - Winform: 在窗体加载的过程中截获异常,如何不让窗体显示出来。

[Winform]Media Player播放控制面板控制,单击事件截获

WinForm中DefWndProcWndProc与IMessageFilter的区别

c# winform 点右上角关闭按钮的程序中如何加入一段代码