Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将新窗口添加到桌面时是否触发任何事件_C#_Windows_Com_Wmi_Pinvoke - Fatal编程技术网

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

C# 将新窗口添加到桌面时是否触发任何事件,c#,windows,com,wmi,pinvoke,C#,Windows,Com,Wmi,Pinvoke,我想知道桌面上出现/出现新窗口时是否触发了任何事件。我愿意使用COM、WMI、WinAPI、UIAutomation或任何其他方法,但选择的语言是C# 实际需要: 一个进程有一个主窗口和许多其他窗口。其中一个窗口的类名是,比如说,X,(我使用pinvoke获得了这个信息)。现在,每当流程中出现通知时,此窗口会弹出几次。我不想显示这个窗口。我没有该进程的代码访问权限,因此我可以禁用该窗口。那么,有没有什么方法可以让我获得一个事件或任何其他机制来跟踪桌面,并且每当一个类名为X的窗口出现/即将出现时,

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

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

如果我对这个问题不清楚,一定要告诉我。 谢谢


编辑:西蒙的答案非常好。我尝试了这一点,并且能够获得除通知/toast窗口(如lync的im toast通知或outlook新邮件通知)之外的所有窗口的通知。我尝试了自动化元素和Windows模式的不同元素,但仍然无法获得这些…任何想法如何获得这些…您可以阅读Simon答案中的注释以了解更多上下文/细节。再次感谢Simon介绍UIAUtomation的强大功能…热爱它

一个选项是。您提供了一个可以接收通知消息的窗口句柄。可能对您有用的通知是
HSHELL\u WINDOWCREATED
HSHELL\u WINDOWACTIVATED

,正如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);
    }
}

MSDN提供了注册windows通知的代码。但这是Windows Server 2008特有的。我想您可以在您的windows版本中找到类似的功能。

我想您可以使用-它支持事件嘿…谢谢…我还有一个问题…我们是否也可以获取有关windows的信息,如通知,例如outlook中的新邮件或lync/skype中的新即时消息等。。。我尝试了上面的代码,但没有显示这种类型的窗口…通过其他win API,我发现,例如,lync toast notification的窗口类与对话窗口类不同。所以我希望在这里举办活动时,我会把窗户藏起来,因为窗户的树很大。该示例使用AutomationElement.RootElement(桌面窗口)作为父窗口,并且不会获取所有子窗口通知。但是您可以使用其他元素作为开始。您可以使用AutomationElement.FromHandle、FromPoint方法等获取其他元素。我正在使用Windows 10上的.NET自动化库。我添加了一个事件处理程序,就像您的示例一样——以根元素、作用域子树为根。但奇怪的是,每次窗口打开时,我们几乎总是看到两个事件。偶尔,可能只有一个事件,但95%以上的时间有两个。事件是不同的对象,但包含相同的EventId和来自相同的源。有什么线索可以找吗?@SteveRobbins-我今天用Windows 10测试了我答案的代码,效果很好。我的示例或其他代码有问题吗?如果是另一个代码,你应该问另一个问题。@SimonMourier问得好。我以前使用的是我自己的代码,但今天我完全按照上面的方式编译了您的代码。我确实看到了相同的行为——但只有少数应用程序(到目前为止有两个)表现出双重打开事件。其中一个是我公司的应用程序,另一个是Adobe Acrobat Reader DC版本2020.006.20034。因此,谜团加深了。