Я пытаюсь установить данные буфера обмена на основе некоторых условий, сначала проверив длину строки и первый символ строки в буфере обмена. Если это вернет true, тогда я хотел бы установить текст буфера обмена на другую строку, а затем получить и отобразить новое значение на моей консоли. Вот мой Clipbpard.h
#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)
{
}
char* 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";
return this->dHbuffer;
}
::GlobalUnlock(this->dHDat);
}
CloseClipboard();
this->isopen = FALSE;
::Sleep(1000);
}
}
void SetData(void)
{
const char* data = this->dHbuffer;
const char* newstring = "Hello World";
const size_t len = strlen(data) + 1;
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), data, len);
GlobalUnlock(hMem);
if (!OpenClipboard(NULL))
{
return;
}
if(strlen(data) + 1 == 8 && (data.at(0) == 1 || data.at(0) == 7)){
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
}
CloseClipboard();
this->isopen = TRUE;
}
private:
void Start(void)
{
if (!OpenClipboard(NULL))
{
return;
}
this->isopen = true;
}
};
}
А вот мой главный. cpp
#include "Clipboard.h"
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->SetData();
std::cout << clipboard->GetData() << std::endl;
}
temp2 = temp1;
}
return 0;
}
Мне удалось заставить его работать без SetData (), вызвав только GetData ( ). проблема, с которой я столкнулся, заключается в том, что она возвращает строку, скопированную в буфер обмена, и после этого я не могу получить какие-либо данные из буфера обмена, т.е. она работает только один раз, когда я запускаю программу, но я хочу, чтобы она была непрерывной для каждой скопированной строки и соответствует условию.
Теперь я изменил data.at (0) на data [0], и мой код смог скомпилироваться без ошибок. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что мои условия всегда возвращают ложное значение, даже когда оно должно возвращать истинное значение. То, что я пытаюсь сделать, это проверить, является ли данные буфера обмена длиной 8 символов и начинается ли она с «1» или «3», но всегда возвращает false. Я перешел к изменению
const char* data = this->dHbuffer;
на
const char* data[] = this->dHbuffer;
Что еще я заметил, так это то, что strlen (data) возвращает 1 в качестве значения. Мой вопрос сейчас таков; Есть ли способ получить фактическую длину строки в виде строки, а не размер массива?
но я получил ошибку; Clipboard.h | 55 | ошибка: инициализатор не может определить размер «данных» | ps Я абсолютный новичок в c ++, и я только начал посещать занятия только на прошлой неделе. Я не совсем понимаю концепцию классов в c ++