Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.068 c
14-1095840635
kaZaNoVa
2004-09-22 12:10
2004.10.10
2 Системы или Защита/изменение файлов и Реестра.


1-1096031373
AdmeraL
2004-09-24 17:09
2004.10.10
TRegIniFile


4-1094575392
Klopan
2004-09-07 20:43
2004.10.10
lpt port


4-1094300672
DeepProg
2004-09-04 16:24
2004.10.10
Таймер, устойчивый при полной загрузке процессора


14-1095714111
Knight
2004-09-21 01:01
2004.10.10
Русские кодовые страницы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский