0

我有一个例程,它获取所有打开的窗口(进程),然后使用 user32 中的 GetClassName 方法搜索它的类名。但是,例如当 Teamviewer 在所有应用程序的类名上时,获取 teamviewer 类名。

示例:记事本打开并且 TeamViewer 在类名:'TeamViewer_TitleBarButtonClass' 记事本打开并且 TeamViewer 关闭类名:'Notepad'

我查看了这是怎么来的,发现 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);
          }
     }
4

1 回答 1

2

Process 类用来猜测哪个窗口是“主”窗口的启发式方法并不完美。应用程序无法将其创建的窗口标记为“这是主窗口”。所以它以最好的猜测:第一个窗口。这肯定会出错,例如,您可能会发现隐藏的登录窗口。

另一种方法是从 Process.Threads 枚举进程中的线程,然后为每个线程使用 EnumThreadWindows() 枚举它拥有的窗口,并在每个线程上调用 GetClassName()。你会以这种方式看到所有的窗户,并且应该穿过你正在寻找的窗户。当无法选择进程时,使用 EnumWindows() 是一种替代方法。这也避免了当前代码在过早枚举“系统”进程时遭受的崩溃。

处理像“TeamViewer”这样的侵入性软件的最好方法就是卸载它。

于 2013-10-02T15:00:03.240 回答