I am coding a screensaver program running on Windows.
In preview mode, Windows calls the program this way :
Screensaver.exe /p ParentWindowHandle
However, when I make this call in my program :
BOOL res = GetClientRect(parentWindowHandle, rect)
res is FALSE, rect is NULL and I get ERROR_INVALID_WINDOW_HANDLE with GetLastError()
GetWindowRect gives me the same results.
But, if I make a call to BOOL res = IsWindow(parentWindowHandle) instead, I get res == TRUE. Does this not mean I have a valid window handle ?
The code looks like this :
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
// ...
// ...
}
On 64-bit Windows, a window handle is 64 bits and cannot fit in an
unsigned int, so your cast is producing a value that is an invalid window handle. You should modify yourGetHandleFromCommandLinefunction so that it returns a properHWND, not anunsigned int, and no type cast is necessary.Also,
GetClientRectreturns the rectangle by storing it into the value pointed at by the second parameter. If you pass itNULL, it has nowhere to store that, so it will either crash or fail with an invalid parameter error. To avoid that, pass in the address of a local variable: