我有一个例程,它会打开所有窗口(进程),然后用GetClassName方法在user32中搜索它的类名。但是,例如,当Teamviewer位于所有应用程序的类名上时,请获取teamviewer类名。
例如:记事本是打开的,TeamViewer在类名上:'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);
}
}发布于 2013-10-02 15:00:03
Process类用来猜测哪个窗口是“主”窗口的启发式方法并不完美。应用程序没有任何方法将它创建的窗口标记为“这是主窗口”。因此,它在最好的猜测:第一个窗口。这当然会出错,例如,您可能会找到一个隐藏的登录窗口。
另一种方法是从Process.Threads枚举进程中的线程,然后对每个线程使用EnumThreadWindows()枚举它拥有的窗口,在每个线程上调用GetClassName()。这样你就可以看到所有的窗户了,并且应该会碰到你要找的那个窗户。当不能选择进程时,使用EnumWindows()是另一种选择。这也避免了当前代码在过早枚举"System“进程时遇到的崩溃。
处理类似"TeamViewer“这样的侵入性软件的最好方法就是卸载它。
https://stackoverflow.com/questions/19135937
复制相似问题