|
21.12.2011, 12:49
|
#1
|
AnyKey`щик
Регистрация: 22.07.2011
Сообщений: 6
Написано одно полезное сообщение
|
CBuilder и буфер обмена
Добрый день.
Может кто-нибудь подскажет, как увязать CBuilder и буфер обмена.
Если поконкретнее, то проблема в следующем:
устанавливаю свою программу в цепочку слежения за буфером обмена, а вот дальше непонятно, как получить сообщение об изменении содержимого буфера. В VisualC сообщение WM_DRAWCLIPBOARD перехватывается явно, а вот где в билдере это сделать непонятно. Да и вообще, как в билдере можно обработать сообщения Windows, отличные от стандартных эвентов компонент?
|
(Offline)
|
|
21.12.2011, 14:55
|
#2
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: CBuilder и буфер обмена
TApplicationEvents компонент
void __fastcall TMainForm::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
switch (Msg.message)
{
case WM_NCLBUTTONUP:
Handled = true;
break;
case WM_NCLBUTTONDOWN:
Handled = true;
break;
case WM_NCMOUSEMOVE:
Handled = true;
break;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.12.2011, 01:05
|
#3
|
AnyKey`щик
Регистрация: 22.07.2011
Сообщений: 6
Написано одно полезное сообщение
|
Ответ: CBuilder и буфер обмена
Спасибо, но...
Делаю так:
...
next_wiever = SetClipboardViewer(Handle);//устанавливаю свое окно в цепочку слежения за буфером обмена
...
и далее
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
switch (Msg.message)
{
case WM_DRAWCLIPBOARD: MessageBox(0,"WM_DRAWCLIPBOARD"," ",MB_OK);//просто вывести сообщение если в буфер что-то скопировано
Handled = true;
break;
}
}
...
В результате - ничего.
Причем установка в цепочку происходит, указатель ненулевой, а вот на изменение содержимого нет реакции.
|
(Offline)
|
|
28.12.2011, 09:20
|
#4
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: CBuilder и буфер обмена
Сообщение от Mick
Спасибо, но...
Делаю так:
...
next_wiever = SetClipboardViewer(Handle);//устанавливаю свое окно в цепочку слежения за буфером обмена
...
и далее
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
switch (Msg.message)
{
case WM_DRAWCLIPBOARD: MessageBox(0,"WM_DRAWCLIPBOARD"," ",MB_OK);//просто вывести сообщение если в буфер что-то скопировано
Handled = true;
break;
}
}
...
В результате - ничего.
Причем установка в цепочку происходит, указатель ненулевой, а вот на изменение содержимого нет реакции.
|
как то так
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,OnCli pboard)
MESSAGE_HANDLER(WM_CHANGECBCHAIN,TWMNoParams,OnChg Chain)
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);
}
еще можно попробовать отлавливать
if (msg.message == WM_DRAWCLIPBOARD)
{
MessageBox(Form1->Handle, "asd", "asd", MB_OK);
Handled = true;
}
else if (msg.message == WM_CHANGECBCHAIN)
{
}
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.12.2011, 01:29
|
#5
|
AnyKey`щик
Регистрация: 22.07.2011
Сообщений: 6
Написано одно полезное сообщение
|
Ответ: CBuilder и буфер обмена
Спасибо, все работает.
Я и раньше пробовал через таблицу откликов, но тип сообщения указывал неверно.
Если не секрет, откуда взято значение TWMNoParams - где можно почитать.
|
(Offline)
|
|
30.12.2011, 09:16
|
#6
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: CBuilder и буфер обмена
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:10.
|