我试图“挂钩”窗口的消息以检测最小化/最大化。我环顾四周,并认为这样做的唯一/最佳解决方案是挂钩窗口的消息,并检查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正在运行,并且它设法找到它,并且它是主窗口句柄。
答案 0 :(得分:6)
HwndSource
和HwndSourceHook
没有按照您的想法行事。它们仅存在于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)
您滥用WindowInteropHelper
。 constructor州的文档:
为指定的Windows Presentation Foundation(WPF)窗口初始化WindowInteropHelper类的新实例。
记事本窗口不是WPF窗口,这就是FromHwnd
返回null
的原因。
事实上,即使其他窗口是WPF窗口,我也不相信它可以在单独的进程中工作。