当向桌面添加新窗口时是否触发任何事件?

本文关键字:是否 任何 事件 窗口 桌面 添加 新窗口 | 更新日期: 2023-09-27 18:10:24

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

实际要求:一个进程有一个主窗口和许多其他窗口。例如,其中一个窗口的类名是X(我使用pinvoke获得此信息)。现在,只要在进程中有通知,这个窗口就会弹出。我不想展示这个窗口。我没有代码访问该进程,所以我可以禁用该窗口。所以有任何方法,我可以得到一个事件或任何其他机制,保持跟踪桌面和任何时候一个窗口与类名X来/即将来它隐藏它。

如果我对这个问题不清楚,请告诉我。由于编辑:Simon的回答真的很好。我试过了,除了通知/烤面包之外,所有窗口都能收到通知,比如lync的im烤面包通知或outlook新邮件通知。我尝试了自动化元素和Windows模式的不同元素,但仍然无法得到那些…有什么办法让我得到那些…你可以阅读西蒙回答中的评论,了解更多的背景/细节。再次感谢Simon为我们介绍了UIAUtomation的强大功能…爱它!

当向桌面添加新窗口时是否触发任何事件?

正如Damien在他的评论中所说,你可以使用UI自动化,就像在c#示例控制台应用程序中那样:

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);
    }
}

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

MSDN提供了注册windows通知的代码。但这是Windows Sever 2008特有的。