我试图“挂钩”窗口的消息来检测最小化/最大化。我环顾四周,认为执行此操作的唯一/最佳解决方案是挂钩窗口的消息,并检查 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% 确定执行代码时记事本正在运行,并且它设法找到它,并且它是主窗口句柄。
HwndSource
and HwndSourceHook
不要做你想做的事。它们仅用于 WPF 和标准 Win32 窗口之间的互操作 - 在同一进程中。它们不能用于挂钩不同进程中窗口的窗口过程。
HwndSource.FromHwnd() 不会创建新的 HwndSource 对象,它“返回指定窗口的 HwndSource 对象”。如果 hWnd 没有关联的,FromHwnd()
将返回 null。这就像打电话System.Windows.Forms.Control.FromHandle
在记事本的 hWnd 上 - 它也会返回 null,因为记事本窗口不是 WinForms 控件。
挂钩另一个进程的窗口过程的方法是使用设置WindowsHookEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx。为了挂钩另一个进程,代码必须用 C 或 C++ 编写 http://support.microsoft.com/kb/318804.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)