2010-02-04 51 views
4

我一直在尝试使用互斥锁的代码,但我无法打开我的EXE按钮后点击 即时通讯成功的不在按钮点击任务栏上的应用程序的多个条目,但我的应用程序只有当我关闭我的表单时启动。 我想按钮点击启动我的应用程序,如果应用程序已经启动,那么我需要专注于以前的运行应用程序。 我怎么能够解决我需要启动以及重新集中并重新打开该应用程序.. IM发送ü我的代码,即时通讯使用按钮单击事件和PLZ修改我的错误...如何设置焦点并启动已在运行的应用程序在c#.net3.5按钮单击事件?

编码在Program.cs的

static void Main() 
{ 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    Application.Run(new Form1()); 
    System.Diagnostics.Process.Start("filename.exe"); 
} 

编码在Form1.cs的

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     bool createdNew; 
     Mutex m = new Mutex(true, "e-Recording", out createdNew); 
     System.Diagnostics.ProcessStartInfo f = new System.Diagnostics.ProcessStartInfo("C:\\windows\\system32\\rundll32.exe", "C:\\windows\\system32\\shimgvw.dll,ImageView_Fullscreen " + "filename.exe".TrimEnd(null)); 

     if (createdNew) Launch(); 

     else 
     { 
      MessageBox.Show("e-Recording is already running!", "Multiple Instances"); 
     } 
    } 
    catch (Exception ex) 
    { 
      System.Diagnostics.Debug.WriteLine(ex.ToString()); 
    } 
} 

回答

3

这是能够找到并切换到一个已经运行的进程匹配你正在尝试启动。

[DllImport("user32.dll")] 
public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); 
public const int SW_RESTORE = 9; 

public void SwitchToCurrent() { 
    IntPtr hWnd = IntPtr.Zero; 
    Process process = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName(process.ProcessName); 
    foreach (Process _process in processes) { 
    // Get the first instance that is not this instance, has the 
    // same process name and was started from the same file name 
    // and location. Also check that the process has a valid 
    // window handle in this session to filter out other user's 
    // processes. 
    if (_process.Id != process.Id && 
     _process.MainModule.FileName == process.MainModule.FileName && 
     _process.MainWindowHandle != IntPtr.Zero) { 
     hWnd = _process.MainWindowHandle; 

     ShowWindowAsync(NativeMethods.HRef(hWnd), SW_RESTORE); 
     break; 
    } 
    } 
} 
+0

什么是NativeMethods.HRef(hWnd)方法? – oopsdazie 2017-05-18 19:59:43

1

我发布一个答案,而回到德尔福的问题做。我解释说,我没有Delphi的背景,但是我在高层描述了我在C#中做了什么来构建一个使用.NET远程处理的InterProcess Communication(IPC)的组件,不仅可以激活正在运行的实例,还可以转发从第二个实例到第一个实例的命令行参数。我链接到一个非常简单易用的组件,它将所有这些功能包装起来。它可能对你有用。

赫斯是从other question我的回答:

要做到这一点,最好的办法其实是在 在你的EXE的启动代码。在 之后,让Explorer启动一个 exe的第二个副本,然后 继续检测它已经运行并且发送一条消息到 正在运行的实例。

就个人而言,我几乎用Delphi没有 经验,但使用互斥和进程间通信 通道I 在.NET应用程序这样做的方式是 。

总的想法是,应用程序的第 实例将 启动,并开始监听一个IPC 通道。它还会创建一个名为 进程间互斥锁。当启动第二个 实例时,将无法使用 创建同名 的互斥,这意味着先前的实例 正在运行,并且正在侦听IPC通道的 上的呼叫。第二个实例 然后通过IPC向第一个实例发送命令行参数 ,并且第一个实例对它们执行了操作。 然后第二个实例退出,没有显示任何UI的 。

我已经上传了这个 组件(C#)的代码,链接如下。 我不相信它有任何外部 依赖关系,我不知道什么 等效的通信机制 德尔福将 - 但希望这 给你一些想法。

InstanceManager Component (C#)

+0

谢谢你的回答...... 作为即时新的德尔福,所以我无法理解的代码.. 这就是为什么我需要在C#代码.net – zoya 2010-02-04 06:21:37

+0

我想你误解了我说的.. 。代码*在C#中是*,但另一个人的问题是关于Delphi。我也不使用Delphi。 – Josh 2010-02-04 06:45:23

+0

您能否再次提供样品?谢谢!我正在拼命寻找这个确切的解决方案。 – oopsdazie 2017-05-18 18:24:42

0

请注意,出于安全原因,不鼓励使用已命名的互斥锁。任何进程(甚至在guest虚拟机帐户下运行的进程)都可以在进程启动之前创建一个具有相同名称的互斥锁。解决这些安全问题通常比根本不使用命名互斥锁更困难。

要解决您的问题,您只需存储进程处理程序或进程标识,然后查找具有该进程标识的窗口。这与任务管理器的工作方式类似。

相关问题