从另一个进程获取窗口状态更改通知

本文关键字:通知 状态 窗口 另一个 进程 获取 | 更新日期: 2023-09-27 18:08:50

我想知道当另一个程序(我没有访问源)的窗口被移动,最小化,关闭等。我在另一个进程中有Window的HWND。我可以得到进程/线程id。我知道如何监控我自己进程的WndProc。但是我不知道如何干净地监控其他进程的WndProc。

到目前为止的想法(还没有尝试过):

  1. 轮询-只是从我的进程定期抓取窗口状态。这是相当直接的,但很"丑陋"。
  2. SetWindowsHookEx(WM_CALLWNDPROCRET) -钩子其他进程的WndProc,但我相信这意味着我需要注入一个DLL到该进程的方法,然后使用某种形式的进程间通信(WM_COPYDATA发送实际数据,或者像一个互斥,只是通知其他进程的东西已经改变)。

第二个将比第一个"干净",但肯定更复杂,特别是因为项目的其余部分是c#,我不认为我可以将c# DLL注入到本机应用程序中。

是否还有其他方法没有包括在上面?方法1是不是也没那么糟糕呢?方法2是不是没有我想的那么复杂?

从另一个进程获取窗口状态更改通知

下面是一个示例:

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似乎是这个库的最佳权威,他提供了相当多的样本。他建议使用原生版本而不是托管版本,但每个版本都有其缺点。对于您的目的,似乎托管版本应该做。