来自Process.MainWindowHandle的C#HwndSource

时间:2011-10-22 14:02:52

标签: c# interop messages hwnd

我试图“挂钩”窗口的消息以检测最小化/最大化。我环顾四周,并认为这样做的唯一/最佳解决方案是挂钩窗口的消息,并检查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可用时,但在我的情况下,我没有。

非常感谢任何解决方法/解决方案,
RenéSackers

P.S。我100%确定在执行代码时Notepad正在运行,并且它设法找到它,并且它是主窗口句柄。

2 个答案:

答案 0 :(得分:6)

HwndSourceHwndSourceHook没有按照您的想法行事。它们仅存在于WPF和标准Win32窗口之间的互操作 - 在同一过程中。它们不能用于在不同的进程中挂钩窗口的窗口过程。

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

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

答案 1 :(得分:0)

您滥用WindowInteropHelperconstructor州的文档:

  

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

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

事实上,即使其他窗口是WPF窗口,我也不相信它可以在单独的进程中工作。