Консультация № 161152
22.02.2009, 23:15
0.00 руб.
0 2 2
Здравствуйте!Подскажите,пожалуйста,как сделать в с++ Builder,чтобы программа следила за буфером обмена и,если там окажеться что либо начинающееся с цифр,то помещала содержимое буфера в поле Edit.Заранее огромное спасибо!!

Обсуждение

давно
Посетитель
7438
7205
23.02.2009, 11:21
общий
это ответ
Здравствуйте, Сергей Черняков!
Чтобы следить за буфером обмена надо добавить свое окно в цепочку viewer-ов буфера обмена при помощи функции HWND SetClipboardViewer( HWND hWndNewViewer);
В приложении выдержка из MSDN с описанием того, что должен делать viewer буфера обмена.
Дальше, чтобы реализовать требуемое, отрабатывая сообщение WM_DRAWCLIPBOARD, работаем с буфером обмена: анализируем тип содержимого, анализируем содержимое и т.д.
Не забываем давать сообщение следующему viewer-у в цепочке и удалять себя из цепочки в конце работы.

Приложение:
The SetClipboardViewer function adds the specified window to the chain of clipboard viewers. Clipboard viewer windows receive a WM_DRAWCLIPBOARD message whenever the content of the clipboard changes.

HWND SetClipboardViewer(
HWND hWndNewViewer // handle to clipboard viewer window
);

Parameters
hWndNewViewer
Handle to the window to be added to the clipboard chain.

Return Values
If the function succeeds, the return value identifies the next window in the clipboard viewer chain.
If an error occurs or there are no other windows in the clipboard viewer chain, the return value is NULL.
To get extended error information, call GetLastError.

Remarks
The windows that are part of the clipboard viewer chain, called clipboard viewer windows,
must process the clipboard messages WM_CHANGECBCHAIN and WM_DRAWCLIPBOARD.
Each clipboard viewer window calls theSendMessage function to pass these messages to the next window in the clipboard viewer chain.

A clipboard viewer window must eventually remove itself from the clipboard viewer chain by
calling the ChangeClipboardChain function — for example, in response to the WM_DESTROY message.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
17042
808
23.02.2009, 15:57
общий
это ответ
Здравствуйте, Сергей Черняков!
Для работы с буфером обмена в среде разработки Borland C++ Builder предусмотрен класс TClipboard. При инициализации приложения, разработанного в данной среде, создаётся один объект данного класса. Для получения доступа к нему имеется функция Clipboard(), которая возвращает указатель на объект TClipboard*. Подключается функция директивой #include <Clipbrd.hpp>
Как известно, буфер обмена может содержать объекты разных форматов (текст, изображение и т.п.). Для проверки, содержится ли в буфере обмена объект заданного формата, предусмотрена функция HasFormat. Чтобы проверить, содержится ли в буфере обмена текст, нужно сделать следующий вызов:
Код:

Clipboard()->HasFormat(CF_TEXT);

Для работы с текстом буфера обмена существует ряд функций, но наиболее удобно работать с ним с помощью свойства объекта класса TClipboard AsText. Это свойство соответствует содержимому буфера обмена в текстовом формате CF_TEXT (приведённому к типу AnsiString). При отсутствии в буфере данных этого формата возвращается пустая строка.
Рассмотрим применение объекта TClipboard относительно Вашей задачи (все названия объектов сохранены в том виде, в котором они по умолчанию генерируются средой разработки). Добавим на заготовку формы объекты классов TTimer и TEdit. Предположим, что нам нужно, чтобы содержимое буфера обмена проверялось каждую минуту. Для этого присвоим свойсву Interval таймера Timer1 значение 60000. В обработчике события срабатывания таймера (TForm1::Timer1Timer(TObject *Sender) - см. приложение) запишем код извлечения текста из буфера обмена:
Код:

AnsiString sClipboardContent; // Строка для хранения текста из буфера
if(Clipboard()->HasFormat(CF_TEXT)) // Если в буфере текст...
{
sClipboardContent = Clipboard()->AsText; // ...копируем его в строку.
}

После этого извлекаем из строки первый символ и, если он оказывается цифрой, то копируем содержимое буфера в поле ввода Edit1.
Удачи!

Приложение:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <Clipbrd.hpp> // Подключаем функции работы с буфером обмена
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
AnsiString sClipboardContent; // Строка для хранения текста из буфера
if(Clipboard()->HasFormat(CF_TEXT)) // Если в буфере текст...
{
sClipboardContent = Clipboard()->AsText; // ...копируем его в строку.
sClipboardContent = sClipboardContent.SubString(0, 1); // Извлекаем из строки 1-й символ
// Если символ - цифра...
if(sClipboardContent == "0" ||
sClipboardContent == "1" ||
sClipboardContent == "2" ||
sClipboardContent == "3" ||
sClipboardContent == "4" ||
sClipboardContent == "5" ||
sClipboardContent == "6" ||
sClipboardContent == "7" ||
sClipboardContent == "8" ||
sClipboardContent == "9") Edit1->Text = Clipboard()->AsText; // ...копируем содержимое буфера в поле ввода.
}
}
//---------------------------------------------------------------------------
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа