Получение данных из буфера обмена - PullRequest
0 голосов
/ 23 апреля 2020

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

namespace Diall_ClipBoard_catch
{
   class ClipBoard
   {
       private:
           ::HANDLE dHDat;
           ::std::string tmpstringsign;
           bool isopen;
           char * dHbuffer;
           char * dHbuffertemp;
           char * dNtoken;
   public:
        ClipBoard(void)
        {
           this->dHbuffer = "";
           this->dHbuffertemp = "";
           this->tmpstringsign = "dnb_4554_2102";
           this->isopen = false;
        };
        ~ClipBoard(void)
        {
            if(this-isopen)
            {
                ::CloseClipboard();
                this->isopen = false;
            }

        }
        void GetData(void)
        {
            this->Start();
            if(this->isopen)
            {
                this->dHDat = ::GetClipboardData(CF_TEXT);

                if(this->dHDat)
                {
                    this->dHbuffer = (char*)::GlobalLock(this->dHDat);

                    if(::std::strcmp(this->dHbuffertemp, this->dHbuffer)!=0 && this->dHbuffer != "" && this->dHbuffer != NULL)
                    {
                        this->dHbuffertemp = this->dHbuffer;
                        ::std::cout << this->dHbuffer << "\n";
                    }

                    ::GlobalUnlock(this->dHDat);
                }
                this->~ClipBoard();
                ::Sleep(1000);
            }
        }
   private:
        Start(void)
        {

        }
   } ;
}

А вот мой основной. cpp

#include <iostream>
#include <windows.h>
#include <cstring>
#include "Clipboard.h"


int main()
{
    ::Diall_ClipBoard_catch::ClipBoard * clipboard = new Diall_ClipBoard_catch::ClipBoard();
    while(1)
    {
        clipboard->GetData();
    }
    return 0;
}

Несмотря на то, что я не получаю никакой ошибки при сборке и запуске на Codeblocks, я все равно не получаю никаких данных, отображаемых на моей консоли. Несмотря на то, что я поиграл с настройками компилятора на кодовом блоке, я все еще не смог заставить его работать

1 Ответ

0 голосов
/ 23 апреля 2020

Комментарии дали достаточно информации для решения этой проблемы.

В функции Start() вам понадобятся некоторые вызовы API, такие как OpenClipboard , SetClipboardData .

И вы не установили для isopen значение true, поэтому при отладке вы обнаружите, что точка останова не может достичь GetClipboardData ().

Добавьте следующий код для проверки:

Start(void)
{
     const char* output = "Hello World";
     const size_t len = strlen(output) + 1;
     HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
     memcpy(GlobalLock(hMem), output, len);
     GlobalUnlock(hMem);
     if (!OpenClipboard(NULL))
     {
         return;
     }
     EmptyClipboard();
     SetClipboardData(CF_TEXT, hMem);
     this->isopen = TRUE;
}

Примечание. Приведенный выше код использует SetClipboardData для копирования текста в буфер обмена, а затем использует GetClipboardData для получения текста.

Вы также можете использовать буфер обмена для самостоятельного копирования текста , Запустите код и проверьте, изменилось ли возвращаемое значение функции GetClipboardSequenceNumber . Если он изменяется, это означает, что содержимое буфера обмена изменилось или буфер обмена был очищен.

Пример кода:

#include <iostream>
#include <windows.h>
#include <cstring>

namespace Diall_ClipBoard_catch
{
    class ClipBoard
    {
    private:
        ::HANDLE dHDat;
        ::std::string tmpstringsign;
        bool isopen;
        char* dHbuffer;
        char* dHbuffertemp;
        char* dNtoken;
    public:
        ClipBoard(void)
        {
            this->dHbuffer = const_cast <char*>("");
            this->dHbuffertemp = const_cast <char*>("");
            this->tmpstringsign = "dnb_4554_2102";
            this->isopen = false;
        };
        ~ClipBoard(void)
        {         

        }
        void GetData(void)
        {
            this->Start();
            if (this->isopen)
            {
                this->dHDat = ::GetClipboardData(CF_TEXT);

                if (this->dHDat)
                {
                    this->dHbuffer = (char*)::GlobalLock(this->dHDat);

                    if (::std::strcmp(this->dHbuffertemp, this->dHbuffer) != 0 && this->dHbuffer != "" && this->dHbuffer != NULL)
                    {
                        this->dHbuffertemp = this->dHbuffer;
                        ::std::cout << this->dHbuffer << "\n";
                    }

                    ::GlobalUnlock(this->dHDat);
                }
                EmptyClipboard();
                CloseClipboard();
                this->isopen = FALSE;
                ::Sleep(1000);
            }
        }
    private:
        void Start(void)
        {
            if (!OpenClipboard(NULL))
            {
                return;
            }
            this->isopen = TRUE;
        }
    };
}

int main()
{
    ::Diall_ClipBoard_catch::ClipBoard* clipboard = new Diall_ClipBoard_catch::ClipBoard();   
    int temp1 = 0, temp2 = 0;
    EmptyClipboard();
    while (1)
    {      
        temp1 = GetClipboardSequenceNumber();
        if (temp1!= temp2)
        {
            clipboard->GetData();
        }

        temp2 = temp1;
    }
    return 0;
}

Отладка:

1

...