我试图“挂接到”窗口的消息中,以检测最小化/最大化。我环顾四周,认为实现此目的的唯一/最佳解决方案是挂接到窗口的消息中,并检查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 ...”错误。当进行断点操作时,也很清楚源变量为null。换句话说:它无法在第一行上获取HwndSource。
我知道可以通过使用“ WindowInteropHelper”来实现,但这就是当您将实际窗口作为Windows.Window可用时,但是在我的情况下我没有。
任何解决方法/解决方案将不胜感激,
雷内·萨克斯(RenéSackers)
附言我100%确信执行代码时记事本正在运行,并且设法找到它,并且它是主窗口句柄。
最佳答案
HwndSource
和HwndSourceHook
不执行您的想法。它们仅用于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++。
关于c# - 来自Process.MainWindowHandle的C#HwndSource,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7860083/