我正在编写一个在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。这不意味着我有一个有效的窗口句柄吗?
代码如下所示:
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
// ...
// ...
}发布于 2012-08-18 04:01:42
在64位Windows上,窗口句柄是64位的,并且不适合unsigned int,因此您的强制转换生成的值是无效的窗口句柄。您应该修改GetHandleFromCommandLine函数,使其返回正确的HWND,而不是unsigned int,并且不需要类型转换。
此外,GetClientRect通过将矩形存储到第二个参数所指向的值中来返回矩形。如果您向它传递NULL,它将无处存储该参数,因此它将崩溃或因无效参数错误而失败。要避免这种情况,请传入局部变量的地址:
RECT rect;
GetClientRect(..., &rect);https://stackoverflow.com/questions/12012318
复制相似问题