Перейти к содержанию
Fire Monkey от А до Я
  • 0

Прослушка буфера обмена и FMX(Clipboard Viewer)


nek

Вопрос

Доброго времени суток. Как "прикинуться" приложению Firemonkey ClipboardViewer'ом? И можно ли потом обойтись малой кровью перепилив это дело под мак?

Не делать же каждые N мс проверку буфера (в моём случае на совпадение с рег. выр)

Вот например код для VCL (C++) , но он не работает в FireMonkey, не знаю какую библиотеку ещё подрубить кроме vcl.clipbrd.hpp (clipbrd.hpp)

Оригинал здесь

// ...class TForm1 : public TForm{// ...private:    // User declarations    HWND FNextCbViewer;    void __fastcall WMChangeCBChain(TWMChangeCBChain &Msg);    void __fastcall WMDrawClipboard(TWMDrawClipboard &Msg);public:     // User declarations    __fastcall TForm1(TComponent* Owner);     BEGIN_MESSAGE_MAP        VCL_MESSAGE_HANDLER(WM_CHANGECBCHAIN, TWMChangeCBChain, WMChangeCBChain)        VCL_MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TWMDrawClipboard, WMDrawClipboard)    END_MESSAGE_MAP(TForm)};// ...
__fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner){    FNextCbViewer = 0; // Изначально никаких попыток перехвата нет} //---------------------------------------------------------------------------// При уничтожении формы "отцепимся" от цепочкиvoid __fastcall TForm1::FormDestroy(TObject *Sender){    if(FNextCbViewer)    {        ChangeClipboardChain(this->Handle, FNextCbViewer);        FNextCbViewer = 0;    }} //---------------------------------------------------------------------------// Эта кнопка будет добавлять наше приложение к цепочке, получающей уведомления// об изменении содержимого Clipboard-аvoid __fastcall TForm1::btnSetViewerClick(TObject *Sender){    if(FNextCbViewer) // Второй раз добавлять себя не будем    {        ShowMessage(L"Уже зарегистрировано");    }    else    {        FNextCbViewer = SetClipboardViewer(this->Handle); // А если еще не делали - добавим    }} //---------------------------------------------------------------------------// Ну, и кнопка, чтобы "отцепиться" вручнуюvoid __fastcall TForm1::btnResetViewerClick(TObject *Sender){    ChangeClipboardChain(this->Handle, FNextCbViewer);    FNextCbViewer = 0;} //---------------------------------------------------------------------------// void __fastcall TForm1::WMChangeCBChain(TWMChangeCBChain &Msg){    // inherited;    Msg.Result = 0;    if(Msg.Remove == FNextCbViewer)    {        FNextCbViewer = Msg.Next;    }    else    {        // Информируем дальше по цепочке о событии изменении цепочки        SendMessage(FNextCbViewer, WM_CHANGECBCHAIN,                    WPARAM(Msg.Remove), LPARAM(Msg.Next));    } }void __fastcall TForm1::WMDrawClipboard(TWMDrawClipboard &Msg){    try    {        // Собственно, уведомление пользователя. Тут можешь делать        // с Clipboard-ом все что нужно        MessageBox(0, _T("Содержимое буфера обмена изменилось"), _T("Внимание!"), MB_ICONINFORMATION);    }    __finally    {        // Но в конце информируем следующего об изменении буфера        SendMessage(FNextCbViewer, WM_DRAWCLIPBOARD, WPARAM(0), LPARAM(0));    }}

Функции передачи дальше по цепочке (если я не ошибаюсь) нет.

ChangeClipboardChain(this->Handle, FNextCbViewer);

Если можно с примерами) желательно не делфи

Ссылка на комментарий

Рекомендуемые сообщения

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...