GetWindowRect() 得到的是在屏幕坐标系下的RECT(即以屏幕左上角为原点)
GetClientRect() 得到的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0)
ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。
我的总结:
如果需要获得窗体在屏幕上的位置,使用GetWindowRect
如果需要获得窗体的大小,使用GetClientRect
改一下:
其实很方便的.先用GetCurrentThreadId获得线程ID,然后用GetThreadDesktop函数:
HDESK GetThreadDesktop(
DWORD dwThreadId // thread identifier
);
直接就获得了桌面句柄.然后用这个:
BOOL GetUserObjectInformation(
HANDLE hObj, // handle of object to get information for
int nIndex, // type of information to get
PVOID pvInfo, // points to buffer that receives the information
DWORD nLength, // size, in bytes, of pvInfo buffer
LPDWORD lpnLengthNeeded // receives required size, in bytes, of pvInfo buffer
);
把nIndex设成UOI_NAME,hObj设成刚刚获得的句柄,就可以在pvInfo接收到桌面名字.
当然也可以创建桌面,枚举桌面等等,还有好多API函数,讲不清楚了,可以参照MSDN或者DELPHI的帮助
当然,我个人还是认为桌面是一个容器