将新窗口添加到桌面时是否触发任何事件

时间:2014-06-26 07:04:07

标签: c# windows com wmi pinvoke

我想知道当桌面上出现/出现新窗口时是否有任何事件被触发。我愿意使用COM,WMI,WinApis,UIAutomation或任何其他方法,但选择的语言是C#。

实际要求: 一个进程有一个主窗口和许多其他窗口。其中一个窗口的类名称是X,(我使用pinvoke得到了这个信息)。现在,只要进程中有通知,此窗口就会弹出一些时间。我不想显示这个窗口。我没有对该进程的代码访问权限,因此我可以禁用该窗口。那么有什么方法可以让我得到一个事件或任何其他机制来跟踪桌面,并且只要有一个类名为X的窗口来/它即将隐藏它。

告诉我是否不清楚这个问题。 谢谢

编辑:Simon的回答非常好。我试过了,并且能够获得所有窗口的通知,除了通知/吐司窗口,例如lync的im toast通知或outlook新邮件通知。我尝试使用自动化元素和Windows模式的不同元素,但仍然无法获得那些...任何想法我怎么能得到那些...你可以阅读西蒙的答案中的评论更多的背景/细节。再次感谢西蒙介绍了UIAUtomation的强大功能 ......爱它!

3 个答案:

答案 0 :(得分:6)

正如Damien在评论中所说,你可以在C#示例控制台应用程序中使用UI自动化:

class Program
{
    static void Main(string[] args)
    {
        Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Subtree, (sender, e) =>
            {
                AutomationElement src = sender as AutomationElement;
                if (src != null)
                {
                    Console.WriteLine("Class : " + src.Current.ClassName);
                    Console.WriteLine("Title : " + src.Current.Name);
                    Console.WriteLine("Handle: " + src.Current.NativeWindowHandle);
                }
            });

        Console.WriteLine("Press any key to quit...");
        Console.ReadKey(true);
    }
}

答案 1 :(得分:2)

一个选项是RegisterShellHookWindow。您提供了一个可以接收通知消息的窗口句柄。可能对您有用的通知是HSHELL_WINDOWCREATEDHSHELL_WINDOWACTIVATED

答案 2 :(得分:0)

Here MSDN提供了注册Windows通知的代码。但这是Windows Sever 2008特有的。我认为您可以找到与您的Window版本类似的内容。