C# Excel 프로세스 닫기

4752 단어 Excel
using   System.Runtime.InteropServices;     

        

  [DllImport("User32.dll",   CharSet   =   CharSet.Auto)]     

  public   static   extern   int   GetWindowThreadProcessId(IntPtr   hwnd,   out   int   ID);     

  protected   void   Button1_Click(object   sender,   EventArgs   e)     

  {     

      Excel.ApplicationClass   excel   =   new   Microsoft.Office.Interop.Excel.ApplicationClass();     

      excel.Workbooks.Open("d:\aaa.xls",   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing,   Type.Missing);     

      IntPtr   t   =   new   IntPtr(excel.Hwnd);     

      int   k   =   0;     

      GetWindowThreadProcessId(t,   out   k);     

      System.Diagnostics.Process   p   =   System.Diagnostics.Process.GetProcessById(k);     

      p.Kill();                     

   }  


프로필 시스템을 수정해야 합니다.config
userName="machine"에서 userName="System"으로 변경
위 섹션은 Win2008에서 찾을 수 없습니다. 설정되지 않았습니다.
사용자 권한을 설정하여 Asp.net 아날로그 사용자 등은 엑셀 프로세스를 죽일 수 없습니다. 마지막 해결 방법은 엑셀 프로세스를 자동으로 죽이는 서비스를 쓰는 것입니다.
 
 
using System;

using System.Diagnostics;

using System.ServiceProcess;



namespace KillExcel

{

    public partial class KillExcel : ServiceBase

    {

        public KillExcel()

        {

            InitializeComponent();

        }



        protected override void OnStart(string[] args)

        {

            // TODO:  。

            double sleeptime =  60 * 1000; //1 

            System.Timers.Timer t = new System.Timers.Timer(sleeptime);// Timer , 10000 ; 

            t.Elapsed += new System.Timers.ElapsedEventHandler(killExcel);// ; 

            t.AutoReset = true;// (false) (true); 

            t.Enabled = true;// System.Timers.Timer.Elapsed ; 



        }

        public void killExcel(object source, System.Timers.ElapsedEventArgs e)

        {

            Process[] myProcesses;

            DateTime startTime;

            myProcesses = Process.GetProcessesByName("Excel");

            // Excel ID, 

            foreach (Process myProcess in myProcesses)

            {

                startTime = myProcess.StartTime;



                if ((DateTime.Now-startTime).Minutes>1)

                {

                    myProcess.Kill();

                }

            }

        }



        protected override void OnStop()

        {

        }

    }

}




위의 서비스에 불안정한 문제가 발생하여 일정 시간 실행된 후에 자동으로 Excel 프로세스를 죽이고 Excel 시작 시간과 현재 시간이 설정된 시간 차이를 계산하지 않습니다. 원인을 찾지 못했습니다.
타이머가 안정적으로 작동하지 않아서, 마지막에 스레드 방식을 사용하여 시간을 정했는데, 이번에는 안정적으로 운행할 수 있게 되었다
 
public partial class KillExcel : ServiceBase

    {

        private int _timeOut;

        private Thread _t;

        public KillExcel()

        {

            InitializeComponent();

            int to;

            int.TryParse(ConfigurationManager.AppSettings["TimeOut"], out to);

            _timeOut = to > 0 ? to : 3;

        }



        protected override void OnStart(string[] args)

        {

            // TODO:  。

            _t = new Thread(new ThreadStart(Monitor));

            _t.IsBackground = true;

            _t.Start();

        }



        private void Monitor()

        {

            int sleeptime = 60 * 1000 * _timeOut;

            while (true)

            {

                Thread.Sleep(sleeptime);

                killExcel();

            }

        }



        public void killExcel()

        {

            Process[] myProcesses = Process.GetProcessesByName("Excel");

            // Excel ID, 

            foreach (Process myProcess in myProcesses)

            {

                if ((DateTime.Now - myProcess.StartTime).Minutes > _timeOut)

                {

                    myProcess.Kill();

                }

            }

            GC.Collect();

        }



        protected override void OnStop()

        {

            

        }

    }


 

좋은 웹페이지 즐겨찾기