//---------------------------------------------------------------------------
#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;
}
}
Как зарегистрировать программу чтоб следила за буфером обмена?
код такой максимально упрощенный:
Код:
Что я не так делаю? Уже по разному пытался, никак : (
Сразу отмечу что перенесение регистрации на клик кнопки тоже не помогает
Цитата: Lei fang
Что я не так делаю? Уже по разному пытался, никак : (
Сразу отмечу что перенесение регистрации на клик кнопки тоже не помогает
Сразу отмечу что перенесение регистрации на клик кнопки тоже не помогает
Добавь обработку 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)
};
{
__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);
}
#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);
}
Код:
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);
}
}
{
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);
}
}
Вот это имелось ввиду? Все равно не реагирует %)
++++
О как замечательно:) Код конечно совсем другой, но главное что работает. Благодарю
Это и есть тот купок кода:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
ChangeClipboardChain(Handle,Hclb);
CanClose = true;
}
или нужный код нужно дописать?
Цитата: ARM9
Собрал проект по вашему коду, хочется узнать, программа после завершения работы убирает себя из цепочки перехватчиков?
Это и есть тот купок кода:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
ChangeClipboardChain(Handle,Hclb);
CanClose = true;
}
или нужный код нужно дописать?
Это и есть тот купок кода:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
ChangeClipboardChain(Handle,Hclb);
CanClose = true;
}
или нужный код нужно дописать?
нужно дописать. Любой законченый код на форуме будет удалятся или редктироваться в том случаее если он не подпадает под лицензию GPL на усмотрение модератора.