【问题标题】:Getting hWnd of a hidden window获取隐藏窗口的 hWnd
【发布时间】:2021-04-12 13:08:14
【问题描述】:

如何获得隐藏窗口的 hWnd?使用我的配置,它返回 0。

这是我尝试过的:

ProcessStartInfo startInfo = new ProcessStartInfo(path);
startInfo.WindowStyle = ProcessWindowStyle.Hidden;

Process process = Process.Start(startInfo);
process.WaitForInputIdle();

MessageBox.Show(process.MainWindowHandle.ToString());

【问题讨论】:

  • 如果我错了,请纠正我,但它返回 0 是否有意义?由于隐藏窗口不存在,因此没有句柄?
  • 确实存在。系统只是不绘制它。如果我启动该过程然后隐藏窗口样式,它工作正常。您可以在此处找到有关窗口样式的更多信息:docs.microsoft.com/en-us/dotnet/api/…
  • 好的,那么,您是否按照ProcessWindowStyle.Hidden 的要求将UseShellExecute 设置为true
  • 我认为默认值为true。但我试过了,它没有任何区别。

标签: c# process system.diagnostics


【解决方案1】:

这对我有用:

delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
    IntPtr lParam);

static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
    var handles = new List<IntPtr>();

    foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
        EnumThreadWindows(thread.Id, 
            (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

    return handles;
}

用法:

ProcessStartInfo startInfo = new ProcessStartInfo(path);
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process process = Process.Start(startInfo);
process.WaitForInputIdle();

IntPtr WindowHandle = EnumerateProcessWindowHandles(process.Id).First();

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2013-01-17
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多