从另一个pocess

时间:2015-08-19 05:00:17

标签: c# windows winforms

我想知道什么时候另一个程序中的窗口(我无法访问源代码)被移动,最小化,关闭等等。我在另一个进程中有窗口的HWND。我可以获取进程/线程ID。我知道监控我自己的进程的WndProc。但我无法弄清楚如何干净地监控其他进程的WndProc。

到目前为止的想法(虽然没试过):

  1. 轮询 - 只是定期从我的进程中获取窗口状态。这是相当直接但是“丑陋”。
  2. SetWindowsHookEx(WM_CALLWNDPROCRET) - 挂钩其他进程的WndProc,但我相信这意味着我需要使用一种方法将DLL注入该进程,然后使用某种形式的进程间通信(WM_COPYDATA发送实际数据,或类似的东西)一个互斥体,只是通知其他过程发生了一些变化)。
  3. 第二个比第一个更“干净”,但肯定更复杂,特别是因为项目的其余部分是在C#中,我认为我不能将C#DLL注入本机应用程序。

    上面没有其他方法吗?方法#1会不会那么糟糕? WOuld方法#2不那么复杂,我在想什么?

1 个答案:

答案 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似乎是这个图书馆的最佳权威,并提供了不少样本。他建议使用原生版本而不是托管版本,但每个版本都有其缺点。出于您的目的,管理版本似乎应该这样做。