Hook на буфер обменаDelphi , ОС и Железо , Буфер обменаHook на буфер обмена
Оформил: DeeCo { *Just create a new form and call it ClipFormats. *Drop a TButton and call it btnUpdate. *Drop a TListBox and call it lbFormats. Then just add the code below and hook up all the event handlers. All it does is display all the formats currently on the clipboard and updates as soon as the clipboard changes. * Erstelle eine Neue Form und nenne sie ClipFormats. * Plaziere einen TButton auf ihr und nenne ihn btnUpdate. * Plaziere eine TListBox auf ihr und nenne sie lbFormats. Dann fuge den untenstehenden Code hinzu und linke alle Ereignis-Prozedure. Es zeigt dann alle Formate an, welche sich momentan in der Zwischenablage befinden und wird aktualisiert, sobald sich der Inhalt der Zwischenablage andert. } unit DynaClip; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TClipFormats = class(TForm) btnUpdate: TButton; lbFormats: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnUpdateClick(Sender: TObject); private { Private declarations } NextWindow: HWND; procedure WMChangeCBChain(var Message: TWMChangeCBChain); message WM_CHANGECBCHAIN; procedure WMDrawClipboard(var Message: TWMDrawClipboard); message WM_DRAWCLIPBOARD; public { Public declarations } end; var ClipFormats: TClipFormats; implementation {$R *.DFM} procedure TMDIChildClipFormats.FormCreate(Sender: TObject); begin NextWindow := SetClipboardViewer(Handle); end; procedure TClipFormats.FormDestroy(Sender: TObject); begin ChangeClipboardChain(Handle, NextWindow); end; procedure TClipFormats.WMChangeCBChain(var Message: TWMChangeCBChain); begin with Message do begin if (Remove = NextWindow) then begin NextWindow := Next; end else begin SendMessage(NextWindow, WM_CHANGECBCHAIN, Remove, Next); end; end; end; procedure TClipFormats.WMDrawClipboard(var Message: TWMDrawClipboard); begin btnUpdate.Click; SendMessage(NextWindow, WM_DRAWCLIPBOARD, 0, 0); end; procedure TClipFormats.btnUpdateClick(Sender: TObject); const PreDefinedFormats: array[1..16] of string = ('CF_TEXT', 'CF_BITMAP', 'CF_METAFILEPICT', 'CF_SYLK', 'CF_DIF', 'CF_TIFF', 'CF_OEMTEXT', 'CF_DIB', 'CF_PALETTE', 'CF_PENDATA', 'CF_RIFF', 'CF_WAVE', 'CF_UNICODETEXT', 'CF_ENHMETAFILE', 'CF_HDROP', 'CF_LOCALE'); var ClipFormat: TClipFormat; szBuffer: array[0..511] of Char; FormatID: string; begin if not OpenClipboard(Handle) then Exit; try lbFormats.Items.BeginUpdate; try lbFormats.Items.Clear; ClipFormat := EnumClipboardFormats(0); while (ClipFormat <> 0) do begin if (ClipFormat in [1..16]) then begin FormatID := PreDefinedFormats[ClipFormat]; end else begin GetClipboardFormatName(ClipFormat, szBuffer, SizeOf(szBuffer)); FormatID := string(szBuffer); end; lbFormats.Items.Add(Format('%s [%d]', [FormatID, ClipFormat])); ClipFormat := EnumClipboardFormats(ClipFormat); end; finally lbFormats.Items.EndUpdate; end; finally CloseClipboard; end; end; end. Перевод контента на русский язык: Это приложение Delphi, которое монтируется на системный буфер обмена и отображает форматы, которые сейчас доступны в буфере обмена, а также обновляет список в реальном времени при изменении буфера обмена. Вот разбивка кода:
Код структурирован хорошо, но есть некоторые минорные проблемы, которые можно улучшить:
В этом альтернативном решении используются следующие изменения:
В этом альтернативном решении обработчик сообщения Hook на буфер обмена - это программа на Delphi, которая отслеживает изменения в содержимом буфера обмена и отображает все доступные форматы данных. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Буфер обмена ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |