我想知道当桌面上出现/出现新窗口时是否有任何事件被触发。我愿意使用COM,WMI,WinApis,UIAutomation或任何其他方法,但选择的语言是C#。
实际要求: 一个进程有一个主窗口和许多其他窗口。其中一个窗口的类名称是X,(我使用pinvoke得到了这个信息)。现在,只要进程中有通知,此窗口就会弹出一些时间。我不想显示这个窗口。我没有对该进程的代码访问权限,因此我可以禁用该窗口。那么有什么方法可以让我得到一个事件或任何其他机制来跟踪桌面,并且只要有一个类名为X的窗口来/它即将隐藏它。
告诉我是否不清楚这个问题。 谢谢
编辑:Simon的回答非常好。我试过了,并且能够获得所有窗口的通知,除了通知/吐司窗口,例如lync的im toast通知或outlook新邮件通知。我尝试使用自动化元素和Windows模式的不同元素,但仍然无法获得那些...任何想法我怎么能得到那些...你可以阅读西蒙的答案中的评论更多的背景/细节。再次感谢西蒙介绍了UIAUtomation的强大功能 ......爱它!
答案 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_WINDOWCREATED
或HSHELL_WINDOWACTIVATED
。
答案 2 :(得分:0)
Here MSDN提供了注册Windows通知的代码。但这是Windows Sever 2008特有的。我认为您可以找到与您的Window版本类似的内容。