Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

Hook на изменения Clipboard а ... ?   Найти похожие ветки 

 
Wm.DIGGER ©   (2005-07-20 22:21) [0]

Господа, пожалуйста, не могли бы вы НАПИСАТЬ ПРИМЕР, как
поставить хук на изменение содержимого clipboard"а?
Только не нужно "умных" фраз, типа "читай мануалы",
или "SetClipboardViewer а дальше смотри сам ...".
Эти фразы есть на каждом сайте, где были вопросы подобные
моему, ещё ни где я не нашёл ОТВЕТА.

Мой хук:


library Hook;

uses
 Windows,
 SysUtils,
 Messages,
 Dialogs;

var MHook:HHook = 0;
   WMPaint:boolean=false;

{$R *.res}

function HCallBack(code : integer; wparam : wparam; lparam : lparam) : lresult; stdcall;
var tag:^tagMSG;
begin
tag := ptr(lparam);
if tag^.message = WM_DRAWCLIPBOARD then showmessage("WM_DRAWCLIPBOARD");
Result := CallNextHookEx(MHook, code, wparam, lparam);
end;

procedure Set_Hook; export;
begin
MHook := SetWindowsHookEx(WH_CALLWNDPROC, @HCallBack, HInstance, 0);
end;

procedure Release_Hook; export;
begin
UnHookWindowsHookEx(MHook);
MHook := 0;
end;

exports
Set_Hook index 1,
Release_Hook index 2;
begin
end.


как, видете, всё довольно стандартно. опишите:
во-первых, где вызывать SetClipboardViewer?
во-вторых, если не сложно, пример напишите ...
спасибо!


 
Davinchi9   (2005-07-20 23:33) [1]

unit unMonitor;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Clipbrd;

type
 TfrmMonitor = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
   FNextViewerHandle: HWND;
   BufferText: String;
   procedure WMDrawClipboard(var message : TMessage); message WM_DRAWCLIPBOARD;
   procedure WMChangeCBCHain(var message : TMessage); message WM_CHANGECBCHAIN;
 end;

var
 frmMonitor: TfrmMonitor;

implementation

uses VcotObj;

{$R *.dfm}

procedure TfrmMonitor.WMDrawClipboard(var message : TMessage);
begin
message.Result:=SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);
 if Clipboard.AsText<>"" then
   begin
     BufferText:=Clipboard.AsText; // ВОТ ЧТО ТЕБЕ НУЖНО
     OnClick(nil);
   end;
end;

procedure TfrmMonitor.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;

end.


 
GrayFace ©   (2005-07-21 00:12) [2]

Wm.DIGGER ©   (20.07.05 22:21)
как, видете, всё довольно стандартно.


Нет. По стандарту, MHook и WMPaint надо в MMF помещать и Code проверять. См. справку, статью "hooks". В статье есть, как минимум, 2 глюка: wParam:word и stdcall у DllMain(или как там ее).


 
Wm.DIGGER ©   (2005-07-21 00:38) [3]


> Нет. По стандарту, MHook и WMPaint надо в MMF помещать и
> Code проверять. См. справку, статью "hooks". В статье есть,
> как минимум, 2 глюка: wParam:word и stdcall у DllMain(или
> как там ее).


ну, WMPaint:boolean=false; - это вообще мусор, случайно не стёр :) а статьи эти очень "красиво" написаны конечно, только вот примеров рабртающих там нет ни где.

P.S. может я и ошибаюсь,ты бы ссылку на статью кинул ... :)


 
Wm.DIGGER ©   (2005-07-21 00:49) [4]


> Davinchi9   (20.07.05 23:33) [1]


а ты это проверял?
что-то у меня это не работает, и честно говоря я ни понимаю, как это должно работать?
мне нужно перехватить событие WM_DRAWCLIPBOARD при заполнении буфера любым приложением. поэтому я хук и писал. и я точно знаю, чтобы поставить своё приложение в качестве "монитора" буфера нужно использовать функцию SetClipboardViewer - это в RSND написано. Только вот не написано где и как её использовать?


 
Davinchi ©   (2005-07-21 00:55) [5]

я кинул реальный код, который сам использовал...
ото включается в класс формы и ловятся события...

SetClipboardViewer - когда действительно делаешь ХУК, а это на основе событий...


 
Wm.DIGGER ©   (2005-07-21 01:01) [6]


> Davinchi ©   (21.07.05 00:55) [5]


слушай, будь хорошим человеком, напиши маленькую прогу, чтобы работал твой код и кинь мне на мыло ... плиззз!


 
Набережных С   (2005-07-21 15:56) [7]

unit ClipboardMonitor;

interface

uses
 Windows, Messages, Classes;

const
 SM_CLIPBRDCHANGE = WM_USER + 455;

type
 TClipboardMonitor = class
 private
   FWnd: HWND;
   FEnable: boolean;
   FOnChange: TNotifyEvent;
   FNextClipbView: HWND;
   procedure SetEnable(const Value: boolean);
 protected
   procedure CreateWindow;
   procedure DestroyWindow;
   procedure DoChange; dynamic;
   procedure WndProc(var Message: TMessage);
   procedure ChangeNotify(var Message: TMessage); message SM_CLIPBRDCHANGE;
   procedure DRAWCLIPBOARD(var Message: TMessage); message WM_DRAWCLIPBOARD;
   procedure CHANGECBCHAIN(var Message: TMessage); message WM_CHANGECBCHAIN;
 public
   destructor Destroy; override;
   procedure DefaultHandler(var Message); override;
   property Enable: boolean read FEnable write SetEnable;
   function HasFormat(Format: Cardinal): boolean;
   property OnChange: TNotifyEvent read FOnChange write FOnChange;
 end;

implementation

{ TClipboardMonitor}

procedure TClipboardMonitor.CHANGECBCHAIN(var Message: TMessage);
begin
 with Message do if FNextClipbView <> HWND(WParam) then
   SendMessage(FNextClipbView, WM_CHANGECBCHAIN, WParam, LParam)
 else
   FNextClipbView:=LParam;
end;

procedure TClipboardMonitor.ChangeNotify(var Message: TMessage);
begin
 DoChange;
end;

procedure TClipboardMonitor.CreateWindow;
begin
 if FWnd = 0 then FWnd:=AllocateHWnd(WndProc);
end;

procedure TClipboardMonitor.DestroyWindow;
begin
 if FWnd <> 0 then DeallocateHWnd(FWnd);
 FWnd:=0;
end;

procedure TClipboardMonitor.DefaultHandler(var Message);
begin
 with TMessage(Message) do
   Result:=DefWindowProc(FWnd, Msg, WParam, LParam);
end;

destructor TClipboardMonitor.Destroy;
begin
 SetEnable(false);
 inherited;
end;

procedure TClipboardMonitor.DoChange;
begin
 if Assigned(FOnChange) then FOnChange(Self);
end;

procedure TClipboardMonitor.DRAWCLIPBOARD(var Message: TMessage);
begin
 if FNextClipbView <> 0 then with Message do
   SendMessage(FNextClipbView, Msg, WParam, LParam);
 PostMessage(FWnd, SM_CLIPBRDCHANGE, 0, 0);
end;

function TClipboardMonitor.HasFormat(Format: Cardinal): boolean;
begin
 Result:=IsClipboardFormatAvailable(Format);
end;

procedure TClipboardMonitor.SetEnable(const Value: boolean);
begin
 if Value = FEnable then Exit;
 if Value then
 begin
   CreateWindow;
   FNextClipbView:=SetClipboardViewer(FWnd)
 end
 else
 begin
   ChangeClipboardChain(FWnd, FNextClipbView);
   DestroyWindow;
 end;
 FEnable:=Value;
end;

procedure TClipboardMonitor.WndProc(var Message: TMessage);
begin
 Dispatch(Message);
end;

end.


 
Wm.DIGGER ©   (2005-07-22 16:33) [8]

Набережных С   (21.07.05 15:56) [7]

спасибки!
но мне нужно через ХУК, а не через события.
неужели ни кто ни когда этого с хуками не делал.

приведённый мной ХУК запросто отлавливает клаву, например
(ну, при соответствующих изменениях типа ХУКА).
А вот КАК всё-таки с помощью хука отловить события Clipboard"a?



Страницы: 1 вся ветка

Текущий архив: 2005.09.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
3-1122532989
Alexey Yershov
2005-07-28 10:43
2005.09.11
Отображение картинки из BLOB поля


3-1122795559
Девушка
2005-07-31 11:39
2005.09.11
IBX - добавление записи, вызов генератора


3-1122378670
alex_***
2005-07-26 15:51
2005.09.11
изменить логин у dbo


8-1114722560
Alpine
2005-04-29 01:09
2005.09.11
Помогите плизз с картинками !


4-1121952980
Vitaly53
2005-07-21 17:36
2005.09.11
Чётность