C# 根据进程ID获取进程主窗口句柄

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 根据进程ID获取进程主窗口句柄相关的知识,希望对你有一定的参考价值。

我的进程是个隐藏窗口的进程,所以用Process.MainWindowHandle 无法获取到值,总是0。后来我在网上搜到了大家对于此类问题的处理方法,就是用枚举,API的EnumThreadWindows
代码如下:

虽然我能获取到句柄了,但是获取到的不是正确的句柄。这里的NRCServer进程是个exe程序,他的WindowState设置为Minimized,ShowInTaskbar 设置为 false 于是窗口被隐藏。所以我没能获取到它的MainWindowHandle,只有进程Id。并且在NRCServer进程启动的时候,弹出对话框显示了主窗口句柄,但是根据调用API函数获取到的句柄,不是显示的这个。
逐语句调试,发现,在EnumWindowsProc中,其实能获取到至少三个同Id号但是不同句柄的窗口。虽然这三个句柄都不是我的进程的,但是让我疑惑的是,怎么会有三个同Id的?另外,究竟该如何获取到正确的那个句柄?!
谢谢各位大虾,帮忙解答一下!

参考技术A 首先你要知道 你要找的是进程的句柄。句柄是操作系统操作的对象,任何一个对象比如一个textbox 也有他的句柄,不一定只要窗口才有句柄。现在你要找到进程的句柄,貌似用C#的话必须要用API 可以用Delphi 试试 这样比较方便 比如 FindWindow 我没有尝试用 这个函数来找 隐藏窗体的句柄 但是 一般 找窗体都没问题的。追问

非常感谢,不过恐怕你没仔细看我的代码和说明。FindWindow只能找可见窗口,隐藏窗口的句柄是找不到的。不过还是谢谢你的回答。

以上是关于C# 根据进程ID获取进程主窗口句柄的主要内容,如果未能解决你的问题,请参考以下文章

C#获取当前窗体句柄及该窗体里的信息

如何从进程 ID 获取主窗口句柄?

如何从进程 ID 获取主窗口句柄?

.NET (C#):只有进程句柄或 PID 时获取子窗口?

c# 怎样获得想要的线程ID

获取进程所有窗口的句柄