Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ 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. } unitUnit1; 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
.