Ctrl+Shift+C Copy Fix

Override Ctrl+Shift+C to copy selected text instead of opening console

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Ctrl+Shift+C Copy Fix
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Override Ctrl+Shift+C to copy selected text instead of opening console
// @author       You
// @match        *://*/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    document.addEventListener('keydown', function(e) {
        // Check if Ctrl+Shift+C is pressed
        if (e.ctrlKey && e.shiftKey && e.key === 'C') {
            // Prevent the default behavior (opening console)
            e.preventDefault();
            e.stopPropagation();

            // Get selected text
            const selectedText = window.getSelection().toString().trim();

            if (selectedText) {
                // Use Clipboard API to copy text
                navigator.clipboard.writeText(selectedText).then(function() {
                    console.log('Text copied to clipboard');
                    showCopyNotification('✓ Copied!');
                }).catch(function(err) {
                    console.error('Failed to copy text: ', err);

                    // Fallback for older browsers
                    fallbackCopyText(selectedText);
                });
            } else {
                console.log('No text selected to copy');
                showCopyNotification('📋 No text selected');
            }
        }
    }, true);

    // Also show notification for regular Ctrl+C copy
    document.addEventListener('keydown', function(e) {
        if (e.ctrlKey && !e.shiftKey && e.key === 'c') {
            // Small delay to ensure copy happens first
            setTimeout(() => {
                const selectedText = window.getSelection().toString().trim();
                if (selectedText) {
                    showCopyNotification('✓ Copied!');
                }
            }, 100);
        }
    }, true);

    // Fallback method for copying text
    function fallbackCopyText(text) {
        const textArea = document.createElement('textarea');
        textArea.value = text;
        textArea.style.position = 'fixed';
        textArea.style.left = '-999999px';
        textArea.style.top = '-999999px';
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();

        try {
            const successful = document.execCommand('copy');
            if (successful) {
                console.log('Text copied using fallback method');
                showCopyNotification('✓ Copied!');
            } else {
                console.error('Fallback copy method failed');
                showCopyNotification('❌ Copy failed');
            }
        } catch (err) {
            console.error('Fallback copy error: ', err);
            showCopyNotification('❌ Copy failed');
        }

        document.body.removeChild(textArea);
    }

    // Function to show a temporary notification with enhanced animations
    function showCopyNotification(message) {
        // Remove existing notification if any
        const existingNotification = document.getElementById('copy-notification');
        if (existingNotification) {
            // Quick disappear animation for existing notification
            existingNotification.style.transition = 'all 0.3s ease-out';
            existingNotification.style.transform = 'translateX(-50%) translateY(20px)';
            existingNotification.style.opacity = '0';
            setTimeout(() => {
                if (existingNotification.parentNode) {
                    existingNotification.parentNode.removeChild(existingNotification);
                }
            }, 300);
        }

        // Create new notification
        const notification = document.createElement('div');
        notification.id = 'copy-notification';
        notification.textContent = message;

        // Initial styles - starting state for appear animation
        notification.style.cssText = `
            position: fixed;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%) translateY(100px);
            background: #6B7280;
            color: white;
            padding: 16px 32px;
            border-radius: 25px;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            font-size: 14px;
            font-weight: 500;
            z-index: 10000;
            box-shadow: 0 8px 35px rgba(0,0,0,0.3);
            backdrop-filter: blur(15px);
            border: 1px solid rgba(255,255,255,0.15);
            min-width: 120px;
            text-align: center;
            transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
            opacity: 0;
            cursor: pointer;
            will-change: transform, opacity;
        `;

        document.body.appendChild(notification);

        // Trigger appear animation after a small delay to ensure CSS is applied
        setTimeout(() => {
            notification.style.transform = 'translateX(-50%) translateY(0)';
            notification.style.opacity = '1';
        }, 10);

        // Auto remove after 2 seconds with disappear animation
        let removeTimeout = setTimeout(() => {
            startDisappearAnimation(notification);
        }, 2000);

        // Click to dismiss with animation
        notification.addEventListener('click', () => {
            clearTimeout(removeTimeout);
            startDisappearAnimation(notification);
        });

        // Enhanced disappear animation function
        function startDisappearAnimation(element) {
            element.style.transition = 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)';
            element.style.transform = 'translateX(-50%) translateY(100px)';
            element.style.opacity = '0';

            setTimeout(() => {
                if (element.parentNode) {
                    element.parentNode.removeChild(element);
                }
            }, 400);
        }

        // Add hover effect for better interactivity
        notification.addEventListener('mouseenter', () => {
            notification.style.transform = 'translateX(-50%) translateY(0) scale(1.05)';
            notification.style.background = '#7E858F';
            notification.style.boxShadow = '0 12px 40px rgba(0,0,0,0.4)';
        });

        notification.addEventListener('mouseleave', () => {
            notification.style.transform = 'translateX(-50%) translateY(0) scale(1)';
            notification.style.background = '#6B7280';
            notification.style.boxShadow = '0 8px 35px rgba(0,0,0,0.3)';
        });
    }
})();