C# HwndSource from Process.MainWindowHandle

本文关键字:MainWindowHandle Process from HwndSource | 更新日期: 2023-09-27 18:12:09

我试图"钩"到窗口的消息来检测最小化/最大化。我已经环顾四周,并认为唯一/最好的解决方案,做到这一点,是挂钩到窗口的消息,并检查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。

我知道这是可能的,通过使用"windowwindowophelper",但那是当你有实际的窗口作为一个窗口。窗口可用,但在我的情况下我没有。

任何变通/解决方案将非常感激,
Rene装袋机

注:我100%确定Notepad在执行代码时正在运行,并且它设法找到它,并且它的主窗口句柄。

C# HwndSource from Process.MainWindowHandle

HwndSourceHwndSourceHook不做你想的事。它们只存在于WPF和标准Win32窗口之间的互操作中——在同一进程中。它们不能用于在不同的进程中挂接窗口的窗口过程。

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

钩子另一个进程的窗口子程的方法是使用SetWindowsHookEx。如果要钩住另一个进程,代码必须用C或c++编写。

你在滥用WindowInteropHelper。构造函数的文档说明:

为指定的Windows Presentation Foundation (WPF)窗口初始化windowwindowophelper类的新实例。

记事本窗口不是WPF窗口,这就是为什么FromHwnd返回null

事实上,我不相信它可以在一个单独进程中的窗口中工作,即使另一个窗口是WPF窗口。

相关文章:
  • 没有找到相关文章