037 視窗取得座標

Post date: 2015/5/14 上午 03:31:22

原文:http://blog.chinaunix.net/u/25372/showart_304363.html

GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。

GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。

ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.

ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标. 我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。

对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,(-3,-29)是窗口的左上角的坐标,相对窗口客户区左上角。

对GetClientRect取得的矩阵ClientToScreen后,矩阵也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。

//C++

HWND hwndAbout = ::FindWindow(NULL, L"小算盤");

RECT rRect = { 0 };

GetWindowRect(hwndAbout, &rRect);

std::cout<<"rect:"<<std::endl;

std::cout<<rRect.bottom<<std::endl;

std::cout<<rRect.left<<std::endl;

std::cout<<rRect.right<<std::endl;

std::cout<<rRect.top<<std::endl;

//C#

using System.Diagnostics;

[DllImport("user32.dll", CharSet = CharSet.Auto)]

public static extern IntPtr FindWindow(string strClassName, string strWindowName);

[DllImport("user32.dll")]

public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);

public struct Rect

{

public int Left { get; set; }

public int Top { get; set; }

public int Right { get; set; }

public int Bottom { get; set; }

}

static void Main(string[] args)

{

Process[] processes = Process.GetProcessesByName("calc");

Process lol = processes[0];

IntPtr ptr = lol.MainWindowHandle;

Rect NotepadRect = new Rect();

GetWindowRect(ptr, ref NotepadRect);

System.Console.WriteLine(NotepadRect.Bottom);

System.Console.WriteLine(NotepadRect.Top);

System.Console.WriteLine(NotepadRect.Left);

System.Console.WriteLine(NotepadRect.Right);

System.Console.ReadLine();

}