c ++ WinApi:GetClientRect失败

时间:2012-08-17 19:52:26

标签: c++ winapi screensaver

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

在预览模式下,Windows以这种方式调用程序:
Screensaver.exe /p ParentWindowHandle

然而,当我在我的程序中进行此调用时:
BOOL res = GetClientRect(parentWindowHandle, rect)
res为FALSE,rect为NULL,我ERROR_INVALID_WINDOW_HANDLE

获得GetLastError()

GetWindowRect给了我相同的结果。

但是,如果我打电话给BOOL res = IsWindow(parentWindowHandle),我会得到res == TRUE。这不是说我有一个有效的窗口句柄吗?

代码如下所示:

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

    // ...
    // ...
}

1 个答案:

答案 0 :(得分:7)

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

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

RECT rect;
GetClientRect(..., &rect);