сравнить данные, сохраненные в буфере обмена - PullRequest
1 голос
/ 12 февраля 2011

Я использую код в этой теме, чтобы перехватить изменения в буфере обмена .

Что именно я делаю или что именно делает код, регистрируя средство просмотра буфера обмена для моего приложения, чтобы оно могло отследить все сделанные изменения буфера обмена.

как только буфер обмена изменится, WndProc запустится и запустит функцию OnClipboardChanged () ..

Копирование текста из Visual Studio в качестве примера с использованием сочетания клавиш (Ctrl + C)

Когда я копирую из Visual Studi ,, данные будут вставлены дважды, что означает, что WM_DRAWCLIPBOARD вызывается дважды? (Пожалуйста, проверьте код)

Как я могу проверить или остановить это поведение?

Я просто хочу убедиться, что вставленные данные не будут продублированы .?

Ответы [ 2 ]

0 голосов
/ 11 октября 2013

Я знаю, что это известная ошибка где-то в цепи буфера обмена. Что вы можете просто сделать против этого поведения, так это отфильтровать эти псевдо-вызовы. Я просто проверяю, кажется ли промежуток времени между звонками человеком. здесь это идет:

    DateTime dtLastChangedNotify = DateTime.MinValue;
    TimeSpan tsHumanReactionTime = TimeSpan.FromMilliseconds(100);
    private void MessageProc(IntPtr hwnd, int Msg, IntPtr WParam, IntPtr LParam, ref bool handled)
    {
        if (Msg == WM_CHANGECBCHAIN)
        {
            if (WParam == _nextCBWatcher)
            {
                _nextCBWatcher = LParam;
            }
            else
            {
                SendMessage(_nextCBWatcher, Msg, WParam, LParam);
            }
        }
        else if (Msg == WM_DRAWCLIPBOARD)
        {
            uint cpid = 0, pid = 0;

            if (_wasReset)
            {
                _wasReset = false;
                return;
            }

            GetWindowThreadProcessId(GetClipboardOwner(), out pid);
            cpid = GetCurrentProcessId();

            // i only want info about what is copied by other programs.
            if (pid != cpid)
            {
                // filter no human calls.
                if ((DateTime.Now - dtLastChangedNotify) > tsHumanReactionTime)
                {
                    OnClipboardChange();
                    dtLastChangedNotify = DateTime.Now;
                }
            }

            SendMessage(_nextCBWatcher, Msg, WParam, LParam);
        }
        else if (Msg == WM_DESTROY)
        {
            ChangeClipboardChain(_ownerWnd, _nextCBWatcher);
        }
    }
0 голосов
/ 12 февраля 2011

Вы можете сохранить хэш-код копируемых данных и посмотреть, соответствует ли последний из них.Вот непроверенный пример для объектов текстовых данных:

        IDataObject iData = Clipboard.GetDataObject();

        Int hash = iData != null ? iData.GetData(DataFormats.Text).GetHashCode() : 0;

        if (ClipboardChanged != null && hash != lastHash)
        {
            ClipboardChanged(this, new ClipboardChangedEventArgs(iData));
            lastHash = hash;
        }

Я не уверен в лучшем способе сделать это в общем, вы всегда можете использовать GetFormats() и получить все пары формат + хеш и сделатьпосмотрите на них, так как я не уверен, что не может быть столкновений в разных форматах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...