Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как зарегистрировать программу чтоб следила за буфером обмена?

408
14 июня 2008 года
Lei fang
265 / / 01.10.2005
Здравствуйте, такая вот у меня беда. Почему-то программа не получает сообщения WM_DRAWCLIPBOARD, хоть я и регистрирую ее с помощью SetClipboardViewer(Form1->Handle).
код такой максимально упрощенный:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
static HWND hNextViewer;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        hNextViewer = SetClipboardViewer(Form1->Handle);
        Application->OnMessage = modCB;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::modCB(tagMSG &msg, bool &Handled)
{
    if (msg.message == WM_DRAWCLIPBOARD)
    {
                MessageBox(Form1->Handle, "asd", "asd", MB_OK);
                Handled = true;
    }
}

Что я не так делаю? Уже по разному пытался, никак : (
Сразу отмечу что перенесение регистрации на клик кнопки тоже не помогает
246
18 июня 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Lei fang
Что я не так делаю? Уже по разному пытался, никак : (
Сразу отмечу что перенесение регистрации на клик кнопки тоже не помогает



Добавь обработку WM_CHANGECBCHAIN

1
19 июня 2008 года
kot_
7.3K / / 20.01.2000
Если вы хотите зарегистрировать свою программу как следящую за буфером обмена - необходимо обрабатывать два сообщения - измениение буфера (WM_DRAWCLIPBOARD) и изменение в цепочке обработчиков (WM_CHANGECBCHAIN).
Кроме того - мало включить свою программу в цепочку - надо не забывать ее исключать оттуда - и передавать сообщения дальше. Полный код выглядит так:
#h - file
Код:
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TMemo *Memo1;
        TImage *Image1;
        void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
private:    // User declarations
void __fastcall OnClipboard(TWMNoParams& Msg);
void __fastcall OnChgChain(TWMNoParams& Msg);
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        BEGIN_MESSAGE_MAP
         MESSAGE_HANDLER(WM_DRAWCLIPBOARD,TWMNoParams,OnClipboard)
         MESSAGE_HANDLER(WM_CHANGECBCHAIN,TWMNoParams,OnChgChain)
        END_MESSAGE_MAP(TComponent)
};

#cpp - file
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
#include <vcl\Clipbrd.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND Hclb;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
SetClipboardViewer(Handle);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 ChangeClipboardChain(Handle,Hclb);
 CanClose = true;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnClipboard(TWMNoParams& Msg){
Memo1->Visible = false;
Image1->Visible = false;
try{
 if(Clipboard()->HasFormat(CF_BITMAP)){
  Image1->Picture->LoadFromClipboardFormat(CF_BITMAP,Clipboard()->GetAsHandle(CF_BITMAP),0);
  Image1->Visible = true;
 }
 else{
  Memo1->Text = Clipboard()->AsText;
  Memo1->Visible = true;
 }
}
catch(...){ SendMessage(Hclb,WM_DRAWCLIPBOARD,0,0);}
}
void __fastcall TForm1::OnChgChain(TWMNoParams& Msg){
  SendMessage(Hclb,WM_CHANGECBCHAIN,0,0);
}
408
20 июня 2008 года
Lei fang
265 / / 01.10.2005
Код:
void __fastcall TForm1::modCB(tagMSG &msg, bool &Handled)
{
    if (msg.message == WM_DRAWCLIPBOARD)
    {
                MessageBox(Form1->Handle, "asd", "asd", MB_OK);
                Handled = true;
    }
        else if (msg.message == WM_CHANGECBCHAIN)
        {
                if(hNextViewer == (HWND)msg.wParam)
            hNextViewer = (HWND)msg.lParam;
            else if(IsWindow(hNextViewer))
            PostMessage(hNextViewer, msg.message, msg.wParam, msg.lParam);
        }
}

Вот это имелось ввиду? Все равно не реагирует %)
++++
О как замечательно:) Код конечно совсем другой, но главное что работает. Благодарю
44K
26 января 2009 года
ARM9
5 / / 25.01.2009
Собрал проект по вашему коду, хочется узнать, программа после завершения работы убирает себя из цепочки перехватчиков?
Это и есть тот купок кода:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
ChangeClipboardChain(Handle,Hclb);
CanClose = true;
}

или нужный код нужно дописать?
1
26 января 2009 года
kot_
7.3K / / 20.01.2000
Цитата: ARM9
Собрал проект по вашему коду, хочется узнать, программа после завершения работы убирает себя из цепочки перехватчиков?
Это и есть тот купок кода:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
ChangeClipboardChain(Handle,Hclb);
CanClose = true;
}

или нужный код нужно дописать?


нужно дописать. Любой законченый код на форуме будет удалятся или редктироваться в том случаее если он не подпадает под лицензию GPL на усмотрение модератора.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог