来自 Process.MainWindowHandle 的 C# HwndSource

标签 c# interop message hwnd

我正在尝试“ Hook ”到窗口的消息中以检测最小化/最大化。我环顾四周,认为唯一/最好的解决方案是挂接到窗口的消息,检查 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% 确定记事本在执行代码时正在运行,并且它设法找到它,它是主窗口句柄。

最佳答案

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

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

Hook 另一个进程的窗口过程的方法是使用SetWindowsHookEx .为了 Hook 另一个进程,the code has to be written in C or C++ .

关于来自 Process.MainWindowHandle 的 C# HwndSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860083/

相关文章:

c# - MySQL 连接器转换问题

c# - 如何使 xUnit 并行运行 Theory?

Java ANSI X923 填充

c++ - 如何正确地将 u8 字符串文字传递给接受 UTF-8 字符串的 C 函数

c# - 使用类型为 DataType 的泛型方法

c# - Asp.Net MVC,从数据库动态加载图像 - 图像闪烁

java - 如何声明 scala 方法以便可以使用可变参数样式从 Java 调用它

background - 如何在前台后台接收消息 - React Native?

mySQL 从每个对话中选择最后一条消息

android - native 消息传递 android 应用程序源代码