Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Не получается отслеживать изменение буфера обмена   Найти похожие ветки 

 
Davinchi   (2004-09-08 19:54) [0]

Вот реальный код из моеей проги. На форме должен быть TMemo. Задача состоит в том, что необходимо создать объект, который ловил бы именение буфера обмена любой программой. Вообще планирую засунуть этот объект в ДЛЛ и загружать её из той программы, которая будет менять буфер обмена (благо такая возможность загружать ДЛЛ из этой рограммы существует).
Но проблема в том, что при передачи дискриптера окна функции, которая помещает в цепочку просмотривальщиков буфера моего объекта явным образом все работает, но если дискриптер окна передавать в качестве переменной процидуры или через property, то ничего не работает. Естественно ничего не работает если дикриптер получать через FindWindow.

Чтобы было понятнее попробуйте код.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Clipbrd,
 StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

type
 TVcotClip = class(TCustomControl)
 private
   { Private declarations }
   FViewerHandle: HWnd;
   FNextViewerHandle: HWnd;
 protected
   { Protected declarations }
   procedure SetViewerHandle(Value: HWnd);
 public
   { Public declarations }
   destructor Destroy; override;
   procedure WMDrawClipboard(var message : TMessage); message WM_DRAWCLIPBOARD;
   procedure WMChangeCBCHain(var message : TMessage); message WM_CHANGECBCHAIN;
   property ViewerHandle: HWnd read FViewerHandle write SetViewerHandle;
 end;

var
 Form1: TForm1;
 VcotClip: TVcotClip;

implementation

{$R *.dfm}

destructor TVcotClip.Destroy;
begin
 inherited Destroy;
 ChangeClipboardChain(FViewerHandle, FNextViewerHandle);
end;

procedure TVcotClip.SetViewerHandle(Value: HWnd);
begin
 FViewerHandle := Value;
 FNextViewerHandle := SetClipboardViewer(FViewerHandle); // ??? так не работает :-(
//  FNextViewerHandle := SetClipboardViewer(Handle); // так работает :-)
end;

procedure TVcotClip.WMDrawClipboard(var message : TMessage);
begin
message.Result:=SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);
 if Clipboard.AsText<>"" then
  begin
     ShowMessage("Буфер обмена изменился на:"+#$D#$A+Clipboard.AsText);
   end;
end;

procedure TVcotClip.WMChangeCBCHain(var message : TMessage);
begin
if message.wParam = FNextViewerHandle then
  begin
  FNextViewerHandle := message.lParam;
  message.Result := 0;
 end
 else
 message.Result := SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN, message.wParam, message.lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 VcotClip := TVcotClip.Create(Form1);
 VcotClip.Parent := Form1;
 VcotClip.Visible:=True;
 VcotClip.SetViewerHandle(Handle);

 // забиваем мемо любым текстом, что было над чем эксперементировать с копированием
 Memo1.Lines.LoadFromFile("C:\Windows\System.ini");
end;

end.


Заранее всем благодарен за любую информацию...


 
Sur   (2004-09-08 22:28) [1]

Ya ispolzuyu etot code dlya monitoringa clipboard
--------------------------------------------------

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
   Nh: THandle;
   procedure WMDRAWCLIPBOARD(var M: TWMDRAWCLIPBOARD); message WM_DRAWCLIPBOARD;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMDRAWCLIPBOARD(var M: TWMDRAWCLIPBOARD);
begin
   Edit1.Perform(WM_PASTE, 0, 0);
   SendMessage(Nh, WM_DRAWCLIPBOARD, 0, 0)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Nh := SetClipboardViewer(Handle)
end;


 
Davinchi ©   (2004-09-09 01:17) [2]

Да, конечно, так все будет работать, но у меня задача ловить изменение буфера не своим приложением, а любым, кто его меняет. В том-то и вся проблема, что от своего приложения я получаю событие об изменении буфера, а от других - нет. Думаю дело в SetClipboardViewer(Handle), т.к. если указывать просто Handle, то все работает, а если указать Handle полученный с помощью FindWindow, то ничего не работает (ну и даже просто если Handle присвоить какой-нибудь преременной типа HWND и подставить ее в SetClipboardViewer работать не будет - ПОЧЕМУ????).

P.S. Над этой проблеммой страдаю третий день и уже день ничего конкретного в нете найти не могу... :-(



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.059 c
1-1096258220
r9000
2004-09-27 08:10
2004.10.10
Работа с dll


14-1095365667
Marser
2004-09-17 00:14
2004.10.10
Опрос: Сколько ников вы сменили


14-1095429006
DeadMeat
2004-09-17 17:50
2004.10.10
HDD Image


9-1085024752
Hater
2004-05-20 07:45
2004.10.10
Сохранение игры


6-1091533976
Victor
2004-08-03 15:52
2004.10.10
Чат на сокетах