2010-02-04 18 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虛擬機帳戶下運行的進程)都可以在進程啓動之前創建一個具有相同名稱的互斥鎖。解決這些安全問題通常比根本不使用命名互斥鎖更困難。

要解決您的問題,您只需存儲進程處理程序或進程標識,然後查找具有該進程標識的窗口。這與任務管理器的工作方式類似。

相關問題