WPF/C中的工艺信息错误。同样的解决方案也适用于Win Forms/C#
好的,我想用c#附加进程。我使用了“系统诊断”类。所以我实际上在做什么:WPF/C中的工艺信息错误。同样的解决方案也适用于Win Forms/C#,c#,wpf,process,window,size,C#,Wpf,Process,Window,Size,好的,我想用c#附加进程。我使用了“系统诊断”类。所以我实际上在做什么: //DEFINITIONS Process[] nameOfProcess; IntPtr ptrToProcessWindow; Process getProcess; //DEFINITIONS //INVOKE `[DllImport("user32.dll")]` `public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle)
//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包含有关应用程序的信息,如:
但是,调试的结果是:
显然,我从过程中得到了错误的值。我已经检查了进程是否被找到,我还检查了“ptrtown”是否正确(并且正确)
我只是将
ptrToProcessWindow
和windowRect
传递给函数GetWindowRect(,)
调试器屏幕截图显示浮点值。这是不正确的,本机窗口仅使用整数成员。因此,对这个问题的一个明显猜测是,您在pinvoke声明中使用了WPF Rect类型。它与RECT严重不匹配,预计会出现垃圾
您必须申报您自己的:
private struct RECT {
public int Left, Top, Right, Bottom;
}
并将[DllImport]声明改为使用RECT
Fwiw,System.Drawing.Rectangle结构也不匹配,它使用宽度和高度,而不是右侧和底部。它在调试器中看起来更好,垃圾更少。哦,如果有人想知道进程的名称[]-->Process[]进程名称[]进程名称=进程。GetProcessesByName(进程名称);你已经看过这个答案了吗?这是正确的。固定的。我会投赞成票,但我只是加入了。“改为使用RECT”是什么意思?您必须修复GetWindowRect的声明。把“Rect”改成“Rect”。哦,我明白了。我想是的。谢谢你,先生:)。