2013-04-06 100 views
0

我有一個有兩個不同句柄的進程。我想根據他們的處理ID關閉一個或另一個。有沒有辦法在C#中做到這一點。如何關閉C#中的進程句柄

+0

你調用[DuplicateHandle(http://msdn.microsoft.com/library/windows/desktop/ms724251.aspx)創建第二個? – 2013-04-06 02:16:36

+0

我沒有。我正試圖關閉由Adobe打開的句柄。我打開了兩個pdf文件;當我根據我正在積極查看的文件查看Adobe進程時,會顯示句柄和ID。我想根據句柄關閉其中一個窗口。如果這是不可能的,請讓我知道如果有另一種方式。 – lance 2013-04-06 02:21:50

+0

所以你不是想關閉進程的重複句柄,而是通過它的'hWnd'關閉窗口,對吧? – 2013-04-06 02:25:18

回答

0

使用此:

public partial class TestClass { 
    [DllImport("user32.dll")] 
    static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); 

    public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam); 

    public static void TestMethod() { 
     var targetName="AcroRd32.exe"; 

     var processArray=(
      from process in Process.GetProcesses() 
      let moduleName=(new Func<Process, String>(x => { 
       try { 
        return x.MainModule.ModuleName; 
       } 
       catch(Win32Exception e) { 
        return default(String); 
       } 
      }))(process) 
      where null!=moduleName 
      where 0==String.Compare(targetName, moduleName, true) 
      select process).ToArray(); 

     EnumWindows(
      (hwnd, lParam) => { 
       foreach(var process in processArray) 
        if(process.MainWindowHandle==hwnd) 
         return !process.CloseMainWindow(); 

       return true; 
      }, 
      IntPtr.Zero 
      ); 
    } 
}