Question

RELEVANT INFORMATION:

I have a subclass procedure that needs to validate the content of the clipboard before it gets pasted.

I have managed to get the content of the clipboard successfully, at least I think so.

QUESTION:

I do not know how to construct the following if statement ( the following is pseudo code ):

if( clipboard content is OK )
    defaul handler;
else
    discard message;

MY EFFORTS TO SOLVE THIS:

So far this is what I have in mind:

LRESULT CALLBACK Decimalni( HWND hwnd, 
    UINT message, WPARAM wParam, LPARAM lParam, 
    UINT_PTR uIdSubclass, DWORD_PTR dwRefData )

{
    switch (message)
    {
    case WM_PASTE:
        {
            bool IsTextValid = true; // indicates validity of text

            if( OpenClipboard(hwnd) ) // open clipboard
            {
                HANDLE hClipboardData;

                // get clipboard data
                if( hClipboardData = GetClipboardData(CF_UNICODETEXT) )
                {
                    // Call GlobalLock so that to retrieve a pointer
                    // to the data associated with the handle returned
                    // from GetClipboardData.

                    wchar_t *pchData = (wchar_t*)GlobalLock(hClipboardData);

                    // copy clipboard data so we can free clipboard

                    wchar_t result[10]; // I just need first 9 characters
                    memset( result, L'0', sizeof(result) );

                    // copy clipboard data WITH TRUNCATION!!!
                    wcsncpy_s( result, 10, pchData, _TRUNCATE );

                    // Unlock the global memory.
                    GlobalUnlock(hClipboardData);

                    /*** parse the text for validity ****/
                    // code for parsing text 
                    // update IsTextValid to indicate success or fail
                    /*** end of parsing *******/

                }

                // Finally, when finished I simply close the Clipboard
                // which has the effect of unlocking it so that other
                // applications can examine or modify its contents.

                CloseClipboard();
            }

            // here should be the problematic if statement
            if( IsTextValid )
                return ::DefSubclassProc( hwnd, message, wParam, lParam);
            else
                return FALSE;
        }
        break;
    case WM_CHAR:
        {
            // filter out some invalid keys
        }
        break;
    case WM_NCDESTROY:
        ::RemoveWindowSubclass( hwnd, Decimalni, 0 ); // remove subclassing
        break;
    }
    return ::DefSubclassProc( hwnd, message, wParam, lParam);
}

Is my idea correct or is there another way to form my if statement?

Thank you.

Best regards.

Was it helpful?

Solution

The code seems plausible, down to the action taken. Bit clunky, but that's Windows API. There may be better ways, but this should work.

One mistake: if the text is OK, you should call DefSubclassProc, not the default window procedure.

If the text is not OK you could consider emptying the clipboard. There is not enough here about your other requirements to talk about that.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top