怎样打开已经存在的进程

xdandroid1 2010-01-05 09:53:34
我已经运行了一个程序,进程名已知,我可以通过进程名判断该进程是否已经运行了,现在的问题是,如果已经运行了,就不想再次运行,而是最大化或者激活已经运行的程序,不知道该怎么做。我是在program.cs里启动的新的进程,我需要在启动前判断,如果存在则打开,谢谢各位高手帮忙
...全文
358 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdandroid1 2010-01-08
  • 打赏
  • 举报
回复
已经解决了
http://www.cnblogs.com/Fooo/archive/2008/09/25/1298455.html
wxm3630478 2010-01-05
  • 打赏
  • 举报
回复

//改下这个就可以

static void _Load_LoadMessage(string path)
{
Form1 f1 = (Form1 )Application.OpenForms["Form1"];
if(f1 != null)
{
f1.WindowState = FormWindowState.Maximized;
f1.Activate();
}
}
风龙-3 2010-01-05
  • 打赏
  • 举报
回复
你查询一下“c#激活进程”,看是否你需要的东东
zhangkewen1234 2010-01-05
  • 打赏
  • 举报
回复
直接写个Application.Exit()就行了
xdandroid1 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhangkewen1234 的回复:]
互斥也行,还提供一种方法给LZ,给点分就行了,比较穷
用枚举进程的方法
C# codeusing System;using System.Diagnostics;namespace test
{publicclass Demo
{publicstaticvoid Main(string[] args)
{
Process[] p= Process.GetProcesses();string processname="egui";if (CheckProcess(p,processname))
{
Console.WriteLine("the process is exist!");
}
}privatestaticbool CheckProcess(Process[] process,string name)
{bool check=false;foreach (Process pin process)
{if (p.ProcessName== name)
{
check=true;break;
}
}return check;

}
}
}
[/Quote]

我所需要的就是Console.WriteLine("the process is exist!")这地方实现的功能
zhangkewen1234 2010-01-05
  • 打赏
  • 举报
回复
互斥也行,还提供一种方法给LZ,给点分就行了,比较穷
用枚举进程的方法

using System;
using System.Diagnostics;
namespace test
{
public class Demo
{
public static void Main(string[] args)
{
Process[] p = Process.GetProcesses();
string processname = "egui";
if (CheckProcess(p,processname))
{
Console.WriteLine("the process is exist!");
}
}

private static bool CheckProcess(Process[] process,string name)
{
bool check = false;

foreach (Process p in process)
{
if (p.ProcessName == name)
{
check = true;
break;
}
}
return check;

}
}
}
yamakasi4050 2010-01-05
  • 打赏
  • 举报
回复
用::OpenProcess()
代码=下
xdandroid1 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yamakasi4050 的回复:]
if (!mutex.WaitOne(100, false))
            {
                //说明进程已存在,然后做你要做的事
            }



[/Quote]
呵呵,我问的就是我要做的事情,你给省略了还
xdandroid1 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yamakasi4050 的回复:]
可以用互斥锁

program.cs代码

static class Program
    {
        static Mutex mutex = new Mutex(true, "给锁起个名字");
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (!mutex.WaitOne(100, false))
            {
                MessageBox.Show("同时只能运行一个实例!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                return;
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new ServerForm());
        }
    }

[/Quote]

我想做的就是在你那个messagebox的地方去激活已经打开的窗口,不过谢谢你还是
yamakasi4050 2010-01-05
  • 打赏
  • 举报
回复
if (!mutex.WaitOne(100, false))
{
//说明进程已存在,然后做你要做的事
}


yamakasi4050 2010-01-05
  • 打赏
  • 举报
回复
可以用互斥锁

program.cs代码

static class Program
{
static Mutex mutex = new Mutex(true, "给锁起个名字");
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
if (!mutex.WaitOne(100, false))
{
MessageBox.Show("同时只能运行一个实例!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ServerForm());
}
}
yamakasi4050 2010-01-05
  • 打赏
  • 举报
回复
开会去了

1、建立mfc动态链接库



引入
#include <Tlhelp32.h>

然后加入如下代码

DWORD m_pId;
DWORD m_thId;

BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
)
{
THREADENTRY32 th;
th.dwSize = sizeof(THREADENTRY32);
HANDLE hThHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

BOOL thr = Thread32First(hThHandle, &th);
DWORD thId;
while(thr)
{
if(th.th32OwnerProcessID == m_pId)
{
thId = th.th32ThreadID;
break;
}
thr = Thread32Next(hThHandle, &th);
}
DWORD proid;
::GetWindowThreadProcessId(hwnd, &proid);
if(proid == m_pId && m_thId == thId)
{
::ShowWindow(hwnd, SW_SHOW);
::SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
::SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
return FALSE;
}
return TRUE;
}
_declspec(dllexport) void OpWnd(DWORD processId, DWORD mainThId)
{
m_pId = processId;
m_thId = mainThId;
::EnumWindows(EnumWindowsProc, NULL);
}

最后在源文件夹xxx.def最末行声明到处函数名OpWnd

编译后将dll复制到c#生成文件夹中


c#调用代码

[Dllimport("dll名字")]
public static extern void OpWnd(uint processId, uint mainThid);

第一个参数是进程id,第二个参数是进程主窗口线程id

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧