0

他のプログラムが (SetClipboardData(fmt, NULL) を呼び出して) 遅延レンダリング データをクリップボードに入れると、私のクリップボード ビューアーは WM_DRAWCLIPBOARD を取得します。
ビューアが GetClipboardData() を呼び出すと、別の WM_DRAWCLIPBOARD を使用してウィンドウ プロシージャが再帰的に呼び出されます。
それについての記述が見つかりません。

#define MY_CF CF_RIFF

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg) {
        case WM_DRAWCLIPBOARD:
            OpenClipboard(hwnd);
            HGLOBAL hglob = GetClipboardData(MY_CF); // Sends recursive WM_DRAWCLIPBOARD
            break;
        default:
            return DefWindowProc( hwnd,uMsg,wParam,lParam);
    }
    return 0;
}
4

1 に答える 1

1

まず、WM_DRAWCLIPBOARD適切に処理していないため、メッセージを他のウィンドウに転送する必要があります

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649025%28v=vs.85%29.aspx
WM_DRAWCLIPBOARD メッセージを受け取る各ウィンドウは、SendMessage 関数を呼び出してメッセージをクリップボード ビューア チェーンの次のウィンドウ。チェーン内の次のウィンドウへのハンドルは SetClipboardViewer によって返され、WM_CHANGECBCHAIN メッセージに応答して変更される場合があります。

第二に、残念なことに、多くを受け取ることWM_DRAWCLIPBOARDは一般的です。経験上、0 から 4 の間で受信するのが一般的です。
醜いトリック (うまくいきます) は、各呼び出しでタイムスタンプを取得することです。前のタイムスタンプに近すぎる場合は、単純に無視します。

于 2013-09-19T15:19:30.643 に答える