|
Вопрос # 872/ вопрос открыт / |
|
Здравствуйте, эксперты!
Как определить что содержимое буфера обмена изменилось, но не по нажатию кнопки и т.п., а как только оно изменилось! Для последующей его очистки
Т.е. во время работы программы буфер должен постоянно быть пустым...
А лучше, как его заблокировать? и разблокировать потом :-)
 |
Вопрос задал: 20.08.1987 (статус: Посетитель)
Вопрос отправлен: 24 августа 2007, 22:17
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, 20.08.1987!
Первое: установить обработчик изменения буфера обмена, при изменени Вам будут приходить сообщения WM_CHANGECBCHAIN / WM_DRAWCLIPBOARD. Пример см. в приложении.
Второе: Очищать буфер при изменении, либо помещать туда свои данные, скажем строку "Копировать запрещено". Непосредственно блокировать буфер нельзя, хотя можно организовать перехват API, ответственных за копирование, но это сложно, долго, неудобно, неуниверсально и глупо.
Приложение: Переключить в обычный режим- {
- An application can be notified of changes in the data stored in the
- Windows clipboard by registering itself as a Clipboard Viewer.
-
- Clipboard viewers use two API calls and several messages to communicate
- with the Clipboard viewer chain. SetClipboardViewer adds a window to the
- beginning of the chain and returns a handle to the next viewer in the chain.
- ChangeClipboardChain removes a window from the chain. When a clipboard change occurs,
- the first window in the clipboard viewer chain is notified via the WM_DrawClipboard
- message and must pass the message on to the next window. To do this, our application
- must store the next window along in the chain to forward messages to and also respond
- to the WM_ChangeCBChain message which is sent whenever any other clipboard viewer on
- the system is added or removed to ensure the next window along is valid.
- }
-
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, Forms, Classes, Controls, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- procedure Button1Click(Sender : TObject);
- procedure Button2Click(Sender : TObject);
- procedure FormCreate(Sender : TObject);
- procedure FormDestroy(Sender : TObject);
- private
- FNextClipboardViewer: HWND;
- procedure WMChangeCBChain(var Msg : TWMChangeCBChain); message WM_CHANGECBCHAIN;
- procedure WMDrawClipboard(var Msg : TWMDrawClipboard); message WM_DRAWCLIPBOARD;
- end;
-
- var
- Form1 : TForm1;
-
- implementation
-
- {$R *.DFM}
-
- procedure TForm1.FormCreate(Sender : TObject);
- begin
- { Initialize variable }
- FNextClipboardViewer := 0;
- end;
-
-
- procedure TForm1.Button1Click(Sender : TObject);
- begin
- if FNextClipboardViewer <> 0 then
- MessageBox(0, 'This window is already registered!', nil, 0)
- else
- { Add to clipboard chain }
- FNextClipboardViewer := SetClipboardViewer(Handle);
- end;
-
-
- procedure TForm1.Button2Click(Sender : TObject);
- begin
- { Remove from clipboard chain }
- ChangeClipboardChain(Handle, FNextClipboardViewer);
- FNextClipboardViewer := 0;
- end;
-
-
- procedure TForm1.WMChangeCBChain(var Msg : TWMChangeCBChain);
- begin
- inherited;
- { mark message as done }
- Msg.Result := 0;
- { the chain has changed }
- if Msg.Remove = FNextClipboardViewer then
- { The next window in the clipboard viewer chain had been removed. We recreate it. }
- FNextClipboardViewer := Msg.Next
- else
- { Inform the next window in the clipboard viewer chain }
- SendMessage(FNextClipboardViewer, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next);
- end;
-
-
- procedure TForm1.WMDrawClipboard(var Msg : TWMDrawClipboard);
- begin
- inherited;
- { Clipboard content has changed }
- try
- MessageBox(0, 'Clipboard content has changed!', 'Clipboard Viewer', MB_ICONINFORMATION);
- finally
- { Inform the next window in the clipboard viewer chain }
- SendMessage(FNextClipboardViewer, WM_DRAWCLIPBOARD, 0, 0);
- end;
- end;
-
-
- procedure TForm1.FormDestroy(Sender : TObject);
- begin
- if FNextClipboardViewer <> 0 then
- begin
- { Remove from clipboard chain }
- ChangeClipboardChain(Handle, FNextClipboardViewer);
- FNextClipboardViewer := 0;
- end;
- end;
-
- end.
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|