user32 GetClassName不正确

时间:2013-10-02 11:33:49

标签: c# visual-c++ dll dllimport user32

我有一个例程,可以获取所有打开的窗口(进程),然后使用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);
          }
     }

1 个答案:

答案 0 :(得分:2)

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

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

最好处理像“TeamViewer”这样的侵入式软件只是卸载它。