Правильно обрабатывать WM_PASTE в процедуре подкласса
РЕЛЕВАНТНАЯ ИНФОРМАЦИЯ:
У меня есть процедура подкласса, которая должна проверить содержимое буфера обмена, прежде чем он будет вставлен.
Мне удалось успешно получить содержимое буфера обмена, по крайней мере, я так думаю.
ВОПРОС:
Я не знаю, как построить следующее if statement
(следующий псевдокод):
if( clipboard content is OK )
defaul handler;
else
discard message;
МОИ УСИЛИЯ ДЛЯ РЕШЕНИЯ ЭТОГО:
Пока это то, что я имею в виду:
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);
}
Правильна ли моя идея или есть другой способ сформировать if statement
?
Спасибо.
С наилучшими пожеланиями.
1 ответ
Код кажется правдоподобным, вплоть до предпринятых действий. Немного неуклюже, но это Windows API. Там могут быть лучшие способы, но это должно работать.
Одна ошибка: если текст в порядке, вы должны вызвать DefSubclassProc, а не оконную процедуру по умолчанию.
Если текст не в порядке, вы можете рассмотреть вопрос об очистке буфера обмена. Здесь недостаточно о ваших других требованиях, чтобы говорить об этом.