如一个位于C:\app.exe的小应用程序,由另外一个程序来定时触发他,但每次触发前先判断该exe是否运行中,如还在运行就强制关闭该exe并且重新运行该exe文件.

解决方案 »

  1.   

    可以考虑用平台调用的方式;以及CreateProcess, TerminateProcess, OpenProcess等进程函数。下面贴一段C++的代码,如果要在C#中使用,记住使用平台调用封装一下:#include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>BOOL GetProcessList () 

        HANDLE         hProcessSnap = NULL; 
        BOOL           bRet      = FALSE; 
        PROCESSENTRY32 pe32      = {0}; 
     
        //  Take a snapshot of all processes in the system.     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);     if (hProcessSnap == INVALID_HANDLE_VALUE) 
            return (FALSE); 
     
        //  Fill in the size of the structure before using it.     pe32.dwSize = sizeof(PROCESSENTRY32); 
     
        //  Walk the snapshot of the processes, and for each process, 
        //  display information.     if (Process32First(hProcessSnap, &pe32)) 
        { 
            DWORD         dwPriorityClass; 
            BOOL          bGotModule = FALSE; 
            MODULEENTRY32 me32       = {0}; 
     
            do 
            { 
                bGotModule = GetProcessModule(pe32.th32ProcessID, 
                    pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));             if (bGotModule) 
                { 
                    HANDLE hProcess; 
     
                    // Get the actual priority class. 
                    hProcess = OpenProcess (PROCESS_ALL_ACCESS, 
                        FALSE, pe32.th32ProcessID); 
                    dwPriorityClass = GetPriorityClass (hProcess); 
                    CloseHandle (hProcess);                 // Print the process's information. 
                    printf( "\nPriority Class Base\t%d\n", 
                        pe32.pcPriClassBase); 
                    printf( "PID\t\t\t%d\n", pe32.th32ProcessID);
                    printf( "Thread Count\t\t%d\n", pe32.cntThreads);
                    printf( "Module Name\t\t%s\n", me32.szModule);
                    printf( "Full Path\t\t%s\n\n", me32.szExePath);
                } 
            } 
            while (Process32Next(hProcessSnap, &pe32)); 
            bRet = TRUE; 
        } 
        else 
            bRet = FALSE;    // could not walk the list of processes 
     
        // Do not forget to clean up the snapshot object.     CloseHandle (hProcessSnap); 
        return (bRet); 
    }
      

  2.   

    private void KillProcess(string processName)
            {
                System.Diagnostics.Process myproc = new System.Diagnostics.Process();
                //得到所有打开的进程
                try
                {
                    foreach (Process thisproc in Process.GetProcessesByName(processName))
                    {
                        if (!thisproc.CloseMainWindow())
                        {
                            thisproc.Kill();
                        }                    
                    }
                }
                catch (Exception Exc)
                {
                    MessageBox.Show(Exc.ToString());
                }
            }        private void Form1_Load(object sender, EventArgs e)
            {
                String tempName = "";
                int begpos;
                int endpos;            foreach (Process thisProc in System.Diagnostics.Process.GetProcesses())
                {
                    tempName = thisProc.ToString();
                    begpos = tempName.IndexOf("(") + 1;
                    endpos = tempName.IndexOf(")");
                    tempName = tempName.Substring(begpos, endpos - begpos);
                    //this.listBox1.Items.Add(tempName);
                    if (tempName == "newfax")
                    {
                        KillProcess(tempName);
                    }
                }
            }        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                //MessageBox.Show(listBox1.SelectedItem.ToString());
                if (listBox1.SelectedItem.ToString() == "newfax")
                {
                    KillProcess(listBox1.SelectedItem.ToString());
                }
            }以上是判断进程里是否有newfax这个文件在运行,如有就关闭它。c#