首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ WinApi : GetClientRect失败

c++ WinApi : GetClientRect失败
EN

Stack Overflow用户
提问于 2012-08-18 03:52:26
回答 1查看 5.1K关注 0票数 3

我正在编写一个在Windows上运行的屏幕保护程序。

在预览模式下,Windows以如下方式调用程序:

Screensaver.exe /p ParentWindowHandle

但是,当我在我的程序中进行此调用时:

BOOL res = GetClientRect(parentWindowHandle, rect)

res为FALSE,rect为NULL,并使用GetLastError()获取ERROR_INVALID_WINDOW_HANDLE

GetWindowRect给了我相同的结果。

但是,如果我改为调用BOOL res = IsWindow(parentWindowHandle),就会得到res == TRUE。这不意味着我有一个有效的窗口句柄吗?

代码如下所示:

代码语言:javascript
复制
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    unsigned int handle = GetHandleFromCommandLine(pCmdLine); // Custom function (tested and approved :) )
    HWND parentWindowHandle = (HWND) handle;
    LPRECT rect = NULL;
    BOOL res = GetClientRect(parentWindowHandle, rect);
    // here, rect == NULL, res == FALSE and GetLastError() returns ERROR_INVALID_WINDOW_HANDLE

    // ...
    // ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-18 04:01:42

在64位Windows上,窗口句柄是64位的,并且不适合unsigned int,因此您的强制转换生成的值是无效的窗口句柄。您应该修改GetHandleFromCommandLine函数,使其返回正确的HWND,而不是unsigned int,并且不需要类型转换。

此外,GetClientRect通过将矩形存储到第二个参数所指向的值中来返回矩形。如果您向它传递NULL,它将无处存储该参数,因此它将崩溃或因无效参数错误而失败。要避免这种情况,请传入局部变量的地址:

代码语言:javascript
复制
RECT rect;
GetClientRect(..., &rect);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12012318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档