【问题标题】:How to close process handle in C#如何在 C# 中关闭进程句柄
【发布时间】:2013-04-06 02:11:00
【问题描述】:

我有一个有两个不同句柄的进程。我想根据他们的句柄 ID 关闭一个或另一个。有没有办法在 c# 中做到这一点。

【问题讨论】:

  • 您是否调用了DuplicateHandle 来创建第二个?
  • 我没有。我正在尝试关闭由 adobe 打开的句柄。我打开了两个pdf;当我根据我正在查看的文件查看 adobe 进程时,它会显示句柄和 ID。我想根据句柄关闭其中一个窗口。如果这不可能,请告诉我是否有其他方法。
  • 所以你不是试图关闭进程的重复句柄,而是通过hWnd关闭窗口,对吧?
  • 如果 hWnd 是句柄,是的。
  • 不是有两个进程吗?或者您确定只有一个进程但有两个窗口?

标签: c# process handle


【解决方案1】:

使用这个:

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
            );
    }
}

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 2015-08-25
    • 2011-10-27
    • 1970-01-01
    • 2011-12-30
    • 2010-10-26
    • 2012-01-31
    • 2014-12-15
    相关资源
    最近更新 更多