我想知道什么时候另一个程序中的窗口(我无法访问源代码)被移动,最小化,关闭等等。我在另一个进程中有窗口的HWND。我可以获取进程/线程ID。我知道监控我自己的进程的WndProc。但我无法弄清楚如何干净地监控其他进程的WndProc。
到目前为止的想法(虽然没试过):
第二个比第一个更“干净”,但肯定更复杂,特别是因为项目的其余部分是在C#中,我认为我不能将C#DLL注入本机应用程序。
上面没有其他方法吗?方法#1会不会那么糟糕? WOuld方法#2不那么复杂,我在想什么?
答案 0 :(得分:1)
以下是一个可以帮助您入门的示例:
AutomationElement windowElement = AutomationElement.FromHandle(WindowHandle);
if(windowElement != null)
{
System.Windows.Automation.Automation.AddAutomationPropertyChangedEventHandler(
windowElement,
System.Windows.Automation.TreeScope.Element, this.handlePropertyChange,
System.Windows.Automation.AutomationElement.BoundingRectangleProperty);
}
private void handlePropertyChange(object src, System.Windows.Automation.AutomationPropertyChangedEventArgs e)
{
if(e.Property == System.Windows.Automation.AutomationElement.BoundingRectangleProperty)
{
System.Windows.Rect rectangle = e.NewValue as System.Windows.Rect;
//Do other stuff here
}
}
你应该在听完窗口的事件后调用System.Windows.Automation.Automation.RemoveAllEventHandlers。 这当然是一个非常基本的样本。 Guy Barker似乎是这个图书馆的最佳权威,并提供了不少样本。他建议使用原生版本而不是托管版本,但每个版本都有其缺点。出于您的目的,管理版本似乎应该这样做。