VC中如何获取窗口相对桌面的位置

来源:百度知道 编辑:UC知道 时间:2024/06/01 17:01:50
我取得一个窗口控件的句柄,比如说窗体上的一个按钮,或者是系统托盘中的一个图标,如何知道它相对于屏幕的绝对位置
yuzikai UOI_NAME只能取到名字,GetUserObjectInformation的其他参数也没有说明哪一个可以取到位置啊,能不能说得更详细一点

好象直接GetWindowRect就可以了

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的帮助