来自Process.MainWindowHandle的C#HwndSource

Ren*_*ers 1 c# interop hwnd messages

我试图"挂钩"窗口的消息以检测最小化/最大化.我环顾四周,并认为这样做的唯一/最佳解决方案是挂钩窗口的消息,并检查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);
Run Code Online (Sandbox Code Playgroud)

它会给我一个"对象引用不设置为对象的实例"."source.AddHook ..."上的错误.在断点时,也清楚源变量为空.换句话说:它无法在第一行获得HwndSource.

我知道可以使用"WindowInteropHelper",但是当你将实际窗口作为Windows.Window可用时,但在我的情况下,我没有.


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

PS我在执行代码时100%确定记事本是否正在运行,它设法找到它,它是主窗口句柄.

shf*_*301 7

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

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

挂钩另一个进程的窗口过程的方法是使用SetWindowsHookEx.为了挂钩另一个进程,代码必须用C或C++编写.