我有一个例程,可以获取所有打开的窗口(进程),然后使用user32中的GetClassName方法搜索它的类名。但是当例如Teamviewer在所有应用程序的类名中时,获取teamviewer类名。
示例:记事本已打开,TeamViewer在classname上:'TeamViewer_TitleBarButtonClass' 记事本是打开的,TeamViewer是关于类名:'记事本'
我看了这是怎么来的,发现Teamviewer将控件置于某些应用程序窗口之上。
那么我怎样才能找到应用程序的真实类名而不是Teamviewer?
Process[] processes = Process.GetProcesses();
StringBuilder className = new StringBuilder(100);
For (int i = 0; i < processes.Length; i++)
{
if (processes[i].MainWindowHandle != IntPtr.Zero)
{
list.Add(processes[i]);
GetClassName(processes[i].MainWindowHandle, className, className.Capacity);
}
}
答案 0 :(得分:2)
Process类用于猜测哪个窗口是“主”窗口的启发式方法并不完美。应用程序没有任何方法可以将它创建的窗口标记为“这是主要的”。所以它最好的猜测:第一个窗口。这肯定会出错,例如,你可能会找到一个隐藏的登录窗口。
另一种方法是从Process.Threads枚举进程中的线程,然后为每个线程枚举它拥有EnumThreadWindows()的窗口,在每个线程上调用GetClassName()。你可以通过那种方式看到所有的窗口,并且应该在你正在寻找的那个窗口上运行。当无法选择流程时,使用EnumWindows()是另一种选择。这也避免了当前代码在过早枚举“系统”进程时遭受的崩溃。
最好处理像“TeamViewer”这样的侵入式软件只是卸载它。