Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-user32.dll-GetWindowRect问题_C#_C# 4.0 - Fatal编程技术网

C#-user32.dll-GetWindowRect问题

C#-user32.dll-GetWindowRect问题,c#,c#-4.0,C#,C# 4.0,我该投什么票。它告诉我必须放置HandleRef对象,但我不知道如何从Process方法获取HandleRef对象。您需要的不是进程句柄,而是窗口句柄 如果您需要进程中已经存在的窗口的窗口坐标,可以使用pinvoke上的一些示例,也可以通过其他方法获得不需要枚举进程的窗口句柄 对于WinForms windows,请使用句柄属性 对于WPF应用程序,请使用WindowInteropHelper 如果您试图枚举无法直接从.NET访问的窗口;例如,从在代码范围外创建顶级窗口的第三方控件,您可能希

我该投什么票。它告诉我必须放置HandleRef对象,但我不知道如何从Process方法获取HandleRef对象。

您需要的不是进程句柄,而是窗口句柄


如果您需要进程中已经存在的窗口的窗口坐标,可以使用pinvoke上的一些示例,也可以通过其他方法获得不需要枚举进程的窗口句柄

对于WinForms windows,请使用
句柄
属性

对于WPF应用程序,请使用
WindowInteropHelper

如果您试图枚举无法直接从.NET访问的窗口;例如,从在代码范围外创建顶级窗口的第三方控件,您可能希望通过win32
EnumWindows
函数进行枚举

EnumWindows的p/Invoke签名可在以下位置获得:

添加:

看起来您要枚举所有窗口和关联进程。使用
EnumWindows
,然后调用
GetWindowThreadProcessId
获取每个窗口的关联进程和非托管线程ID

p/Invoke签名在此处可用:

最后,您可以通过静态方法
GetProcessById
获取流程对象

添加(#2):

下面是一个简短的控制台程序,可以枚举窗口、进程和线程ID。与您的代码片段有一些不同之处

  • 我使用IntPtr,而不是HandleRef。正如其他人所指出的,这可能会让你感到困惑
  • 我没有指定
    return
    属性。如果需要,您应该能够将其添加回
  • 我以管理员的身份运行;如果您使用用户级别的权限运行,某些事情可能会以不同的方式运行
  • 使用新的HandleRef(pr,pr.MainWindowHandle)可能会起作用。假设您的程序实际上有一个主窗口。获得这些信息肯定有更简单的方法


    您的foreach循环将需要工作,而不是在Process.GetCurrentProcess()上编译。尝试迭代所有进程会破坏代码,您将获得特权系统进程,这些进程不太关心共享信息。不可能猜出你为什么要这么做。使用EnumWindows枚举桌面上的所有顶级窗口。

    这将起作用,但首先需要使用winapi函数查找窗口的IntPtr hwnd,如:


    我必须知道所有进程的句柄,而不仅仅是我的应用程序。@Sergey:如果你阅读了文档,你会发现它不适用于这里。这是一个进程句柄,而不是一个窗口句柄。你的链接对OP(显然是谁已经找到了它)没有帮助。它仅显示如何在应用程序中获取窗体的窗口句柄。如果这是一个用例,那么您根本不需要使用GetWindowRect;NET表单已经可以为您提供这些信息-1你跳过了一步;您需要首先从窗口获取本机句柄。例如,如果窗口是应用程序中的C#主窗体(假设是WinForms应用程序),那么您将使用new
    HandleRef(this,this.Handle)您需要首先获取相关窗口的句柄(Process.handle可能不是它)。HandlerRef(pr,pr.MainWindowHandle)不起作用。感谢您提供Process.GetCurrentProcess()。我已经修好了。好吧,把GetWindowRect()参数改为IntPtr,HandleRef是不必要的。谢谢!但我很困惑。是的,看起来它不允许我从访问其他进程的窗口属性;但我在我的机器上以管理员的身份运行。我将发布一个到源代码的链接,以便您可以在您的环境中的测试项目中尝试它。
    
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);
    
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;        // x position of upper-left corner
        public int Top;         // y position of upper-left corner
        public int Right;       // x position of lower-right corner
        public int Bottom;      // y position of lower-right corner
    }
    
    foreach (Process pr in Process.GetProcesses())
    {
        RECT rc;
        GetWindowRect(???, out rc);
    
    [DllImport("user32.dll")]
    public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);
    
    Rect r = new Rect();
    GetWindowRect(hwnd, ref r);