因为A程序在退出时有相关处理,所以不能直接杀掉A的进程。目前我是想通过B发送一个WINDOWS消息给A,A收到后,自己关闭。请问如何实现?

解决方案 »

  1.   

    定义一个特定的Windows 消息,也就是定义个常量,通常必须比WM_USER大的值。让A程序的Form重载WndProc,处理你定义的这个常量,调用Close来关闭程序。当然,前提是,你的B程序能拿到A程序的主窗口的Handle,才能使用SendMessage。
      

  2.   

    通过Process.GetProcessByName()得到进程,然后得到进程的句柄行不行?
    还有,WM_USER是多大的值?
      

  3.   

    Process.GetProcessByName()
    p.kill();
      

  4.   

    .NET Framework 类库  
    Process.CloseMainWindow 方法 通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。 返回值
    如果成功发送了关闭消息,则为 true;如果关联进程没有主窗口或禁用了主窗口(例如,如果当前显示模式对话框),则为 false。
      

  5.   

    下面的示例启动一个记事本实例。然后它最多在 10 秒内,以两秒为间隔检索关联进程的物理内存使用情况。该示例检测该进程在经过 10 秒后是否退出。如果该进程在 10 秒后仍在运行,该示例就会将其关闭。using System;
    using System.Diagnostics;
    using System.Threading;namespace Process_Sample
    {
       class MyProcessClass
       {
          public static void Main()
          {
             try
             {
                Process myProcess;
                myProcess = Process.Start("Notepad.exe");
                // Display physical memory usage 5 times at intervals of 2 seconds.
                for (int i = 0;i < 5; i++)
                {
                   if (!myProcess.HasExited)
                   {
                       // Discard cached information about the process.
                       myProcess.Refresh();
                       // Print working set to console.
                       Console.WriteLine("Physical Memory Usage: " 
                                            + myProcess.WorkingSet.ToString());
                       // Wait 2 seconds.
                       Thread.Sleep(2000);
                   }
                   else {
                       break;
                   } 
                }            // Close process by sending a close message to its main window.
                myProcess.CloseMainWindow();
                // Free resources associated with process.
                myProcess.Close();         }
             catch(Exception e)
             {
                Console.WriteLine("The following exception was raised: ");
                Console.WriteLine(e.Message);
             }
          }
       }
    }
      

  6.   

    要达到这个目的,方法非常多,就看你喜欢哪种方法:
    1、发windows消息
    2、通过进程
    3、通过读写中间文件
    4、用MSMQ
    ......立即成为编程经验丰富的程序员不是梦,详见:http://www.psec.net.cn
      

  7.   

    WM_USER=0x400;
    UM_CLOSEWINDOW = WM_USER+1000;Process[] p = Process.GetProcessesByName(APP_NAME);
    if (p.Length > 0)
    {
    IntPtr mainWindowHandle = p[0].MainWindowHandle;
    if (mainWindowHandle == IntPtr.Zero) //缩小至托盘时MainWindowHandle为零
    {
        mainWindowHandle = FindWindow(null, "标题名称");
        bool ok = SendMessage(mainWindowHandle, UM_CLOSEWINDOW, IntPtr.Zero, IntPtr.Zero);
    }
    }[DllImport("user32.dll", SetLastError = true)]
    public static extern bool SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);protected override void WndProc(ref System.Windows.Forms.Message m)
    {
       if(m.Msg == UM_CLOSEWINDOW)
       {
             //TODO:保存操作
             this.Close(); 
       }
       base.WndProc(ref m);
    }