C # HwndSource из Process.MainWindowHandle - PullRequest
1 голос
/ 22 октября 2011

Я пытаюсь "зацепить" сообщения окна, чтобы обнаружить минимизацию / максимизацию. Я оглянулся и думаю, что единственное / лучшее решение для этого - подключиться к сообщениям окна, проверить сообщение 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, но в моей ситуации я не могу.

Любые обходные пути / решения будут очень признательны,
Рене Сакерс

P.S. Я на 100% уверен, что Блокнот работает, когда код выполняется, и ему удается найти его, и его дескриптор главного окна.

Ответы [ 2 ]

7 голосов
/ 22 октября 2011

HwndSource и HwndSourceHook не делайте то, что вы думаете. Они существуют только для взаимодействия между WPF и стандартными окнами Win32 - в одном и том же процессе. Их нельзя использовать для перехвата оконной процедуры окна в другом процессе.

HwndSource.FromHwnd () не создает новый объект HwndSource, он «возвращает объект HwndSource указанного окна». Если у hWnd нет того, с кем он связан, FromHwnd() вернет ноль. Это было бы похоже на вызов System.Windows.Forms.Control.FromHandle на hWnd из блокнота - который также возвращает ноль, поскольку окно блокнота не является элементом управления WinForms.

Чтобы перехватить оконную процедуру другого процесса, используйте SetWindowsHookEx . А чтобы подключить другой процесс, код должен быть написан на C или C ++ .

0 голосов
/ 22 октября 2011

Вы неправильно используете WindowInteropHelper. Документация для конструктора гласит:

Инициализирует новый экземпляр класса WindowInteropHelper для указанного окна Windows Presentation Foundation (WPF).

Окно блокнота не является окном WPF, поэтому FromHwnd возвращает null.

На самом деле, я не верю, что это когда-либо могло бы работать для окна в отдельном процессе, даже если другое окно было окном WPF.

...