Хорошо, поэтому я хочу присоединить процесс с помощью С#. Я использовал класс "System.Diagnostic". Итак, что я на самом деле делаю:
//DEFINITIONS
Process[] nameOfProcess;
IntPtr ptrToProcessWindow;
Process getProcess;
//DEFINITIONS
//INVOKE
'[DllImport("user32.dll")]'
'public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);'
//INVOKE
//USING CODE
getProcess = nameOfProcess[0];
ptrToProcessWindow = getProcess.MainWindowHandle;
GetWindowRect(ptrToProcessWindow, ref windowRect);
//USING CODE
Итак, windowRect:
Rect windowRect = new Rect();
windowRect имеют информацию о приложении, например:
Но результатом отладки является следующее:
Очевидно, что я получаю неправильные значения от процесса. Я уже проверил, найден ли процесс, я также проверил, правильно ли "ptrToWindow" (и это).
Я просто ptrToProcessWindow
и windowRect
для функции GetWindowRect(,)
<--- LOOK AT//ИСПОЛЬЗОВАНИЕ КОДА //
PS Я использую точно такой же метод в С# Win Forms, и он отлично работает.
Снимок экрана вашего отладчика показывает значения с плавающей запятой. Это не может быть правильно, родная структура RECT Windows использует только целочисленные члены. Таким образом, очевидная догадка заключается в том, что вы использовали тип WPF Rect в своем объявлении pinvoke. Это резкое несоответствие с RECT, ожидается мусор.
Вам придется объявить о себе:
private struct RECT {
public int Left, Top, Right, Bottom;
}
И исправьте свою декларацию [DllImport], чтобы вместо этого использовать RECT.
Fwiw, структура System.Drawing.Rectangle тоже не соответствует, она использует ширину и высоту вместо правого и нижнего. Он выглядит лучше в отладчике, меньше мусора.