BackCopy.exe的关闭有一系列条件,我想用另外一个程序结束它,但不想使用结束进程的方式。于是写:
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_QUERYENDSESSION = 0x0011;
const int WM_CLOSEPROGRAM = 0x8001;
switch (m.Msg)
{
//系统退出消息处理,WM_QUERYENDSESSION是询问程序是否需要关闭,
//要有相应的返回值,0不关闭程序;1关闭程序
case WM_QUERYENDSESSION:
m.Result = (IntPtr)1;
return;
case WM_CLOSEPROGRAM:
textBox1.Text = "";
Close();
break;
default:
break;
}
base.WndProc(ref m);
}
在要它结束的程序中写到:
int FindBackCopy(System.IntPtr param0, System.IntPtr param1)
{
StringBuilder s = new StringBuilder(256);
baseclass.NativeMethods.GetWindowTextW(param0, s, s.Capacity);
if (s.ToString().Trim().IndexOf("BackCopy") != -1)
{
baseclass.NativeMethods.SendMessageW(param0, baseclass.NativeConstants.WM_CLOSEPROGRAM , 0, 0);
return 0;
}
return 1;
}
private void button1_Click(object sender, EventArgs e)
{
baseclass.WNDENUMPROC backcopyproc = new baseclass.WNDENUMPROC(FindBackCopy);
baseclass.NativeMethods.EnumWindows(backcopyproc, 0);
......
}
其中:
public partial class NativeConstants
{
public const int WM_CLOSEPROGRAM = 0x8001;
}
WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF。
#define WM_USER 0x0400
WM_APP常量是Windows帮助应用程序定义私有消息,通常使用WM_APP+一个整数值,但总值不能超过0xBFFF。
#define WM_APP 0x8000
这两个都定义在WinUser.h中。