首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >user32 GetClassName不正确

user32 GetClassName不正确
EN

Stack Overflow用户
提问于 2013-10-02 11:33:48
回答 1查看 1.8K关注 0票数 0

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

例如:记事本是打开的,TeamViewer在类名上:'TeamViewer_TitleBarButtonClass‘记事本是打开的,TeamViewer是打开的类名:’记事本‘

我查看了这些信息,发现Teamviewer在一些应用程序窗口上放置了一个控件。

那么,我如何才能找到应用程序的真实类名而不是Teamviewer呢?

代码语言:javascript
复制
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);
          }
     }
EN

回答 1

Stack Overflow用户

发布于 2013-10-02 15:00:03

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

另一种方法是从Process.Threads枚举进程中的线程,然后对每个线程使用EnumThreadWindows()枚举它拥有的窗口,在每个线程上调用GetClassName()。这样你就可以看到所有的窗户了,并且应该会碰到你要找的那个窗户。当不能选择进程时,使用EnumWindows()是另一种选择。这也避免了当前代码在过早枚举"System“进程时遇到的崩溃。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19135937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档