Форум: "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