3

Windowsで実行されているスクリーンセーバープログラムをコーディングしています。

プレビューモードでは、Windowsは次のようにプログラムを呼び出します。
Screensaver.exe /p ParentWindowHandle

ただし、プログラムでこの呼び出しを行うと、
BOOL res = GetClientRect(parentWindowHandle, rect)
resはFALSE、rectはNULLになり、次のようになりますERROR_INVALID_WINDOW_HANDLEGetLastError()

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

    // ...
    // ...
}
4

1 に答える 1

7

64ビットWindowsでは、ウィンドウハンドルは64ビットであり、に収まらないunsigned intため、キャストは無効なウィンドウハンドルである値を生成しています。関数を変更して、ではなくGetHandleFromCommandLine適切なを返すようにする必要があります。型キャストは必要ありません。HWNDunsigned int

また、GetClientRect2番目のパラメーターが指す値に長方形を格納することにより、長方形を返します。渡すとNULL、それを保存する場所がないため、クラッシュするか、無効なパラメータエラーで失敗します。これを回避するには、ローカル変数のアドレスを渡します。

RECT rect;
GetClientRect(..., &rect);
于 2012-08-17T20:01:41.667 に答える