Попробуй использовать CopyFileEx с callback-функцией, внутри которой проверяй прошел ли нужный интервал времени и, если прошел, то изменяй глобальную переменную, переданную в параметр pbCancel... Грубо - так:
BOOL Cancel = FALSE;
DWORD WINAPI CallbackCopy(...)
{
// ...
// Тут проверяешь сколько времени прошло после запуска CopyFileEx
// Если больше 3-х секунд - то
Cancel = TRUE;
}
// Сам вызов CopyFileEx:
if( !CopyFileEx(..., ..., CallbackCopy, ..., &Cancel, ...) )
{
// ошибка
}