【问题标题】:C# HwndSource from Process.MainWindowHandle来自 Process.MainWindowHandle 的 C# HwndSource
【发布时间】:2011-12-13 04:33:51
【问题描述】:

我正在尝试“挂钩”到窗口的消息以检测最小化/最大化。我环顾四周,认为这样做的唯一/最佳解决方案是挂钩窗口的消息,并检查 WM_WINDOWPOSCHANGED 消息,然后检查它的状态。

我遇到了问题。

System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(System.Diagnostics.Process.GetProcessesByName("notepad")[0].MainWindowHandle);
System.Windows.Interop.HwndSourceHook hook = new System.Windows.Interop.HwndSourceHook(WndProc);
source.AddHook(hook);

它会给我一个“未设置对象实例的对象引用”。 “source.AddHook ...”上的错误。设置断点时,源变量为空也很明显。换句话说:它无法在第一行获取 HwndSource。

我知道使用“WindowInteropHelper”是可能的,但那是当您将实际窗口作为 Windows.Window 可用时,但在我的情况下我没有。

非常感谢任何解决方法/解决方案,
雷内·萨克尔斯

附注我 100% 确定在执行代码时记事本正在运行,并且它设法找到它,并且它是主窗口句柄。

【问题讨论】:

    标签: c# interop messages hwnd


    【解决方案1】:

    您误用了WindowInteropHelperconstructor 的文档指出:

    为指定的 Windows Presentation Foundation (WPF) 窗口初始化 WindowInteropHelper 类的新实例。

    记事本窗口不是 WPF 窗口,这就是 FromHwnd 返回 null 的原因。

    事实上,我不相信它可以在一个单独的进程中为一个窗口工作,即使另一个窗口是一个 WPF 窗口。

    【讨论】:

      【解决方案2】:

      HwndSourceHwndSourceHook 不要做你想做的事。它们仅存在于 WPF 和标准 Win32 窗口之间的互操作 - 在同一进程中。它们不能用于在不同进程中挂钩窗口的窗口过程。

      HwndSource.FromHwnd() 不会创建新的 HwndSource 对象,它“返回指定窗口的 HwndSource 对象”。如果 hWnd 没有与之关联的,FromHwnd() 将返回 null。这就像从记事本调用 hWnd 上的System.Windows.Forms.Control.FromHandle - 由于记事本窗口不是 WinForms 控件,因此也会返回 null。

      挂钩另一个进程的窗口过程的方法是使用SetWindowsHookEx。并且为了钩住另一个进程,the code has to be written in C or C++

      【讨论】:

      • 好的,这澄清了一些事情,谢谢。我已经在考虑 SetWindowsHookEx,但是从键盘和鼠标钩子断开连接开始时有一些不好的经历。我会试一试。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2016-08-20
      • 2013-12-05
      相关资源
      最近更新 更多