2016-08-16 122 views
-1

我正在开发一个应用程序,它在前台有一个Windows资源管理器窗口时触发。我的应用程序触发一个窗口(窗体),它将被放置在靠近打开的Windows资源管理器的屏幕上(计划将其保留在搜索选项的下方)。如何使用.net获取Windows资源管理器的位置?

但我没有得到任何东西来获得前台“窗口资源管理器”窗口的窗口位置。

是否有任何方式使用.net读取当前前台“Windows资源管理器”窗口的位置?

+0

有本地的Win32 API为您查询正在运行的进程和他们的窗户,所以你应该寻找类似的帖子,然后PInvoke的。 –

+0

@LexLi我已经搜索,但我没有得到任何方法来检索Windows资源管理器的窗口位置。 –

回答

2

您可以通过使用非托管代码来完成此操作。

创建一个类:

class RectMethods 
    { 
     // http://msdn.microsoft.com/en-us/library/ms633519(VS.85).aspx 
     [DllImport("user32.dll", SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); 

     // http://msdn.microsoft.com/en-us/library/a5ch4fda(VS.80).aspx 
     [StructLayout(LayoutKind.Sequential)] 
     public struct RECT 
     { 
      public int Left; 
      public int Top; 
      public int Right; 
      public int Bottom; 
     } 
    } 

然后,确定explorer进程拿起你的手柄,并采取坐标和窗口的大小,并从那里你可以做你想做什么:

  var processes = System.Diagnostics.Process.GetProcesses(); 
      foreach (var process in processes) 
      { 
       if (process.ProcessName == "explorer") 
       { 
        var hWnd = process.Handle; 
        RectMethods.RECT rect = new RectMethods.RECT(); 
        if (RectMethods.GetWindowRect(hWnd, ref rect)) 
        { 
         Size size = new Size(rect.Right - rect.Left, 
           rect.Bottom - rect.Top); 
        } 
       } 
      } 

设置“允许不安全的代码”的属性/生成...

相关问题